ΠΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ ΡΠΈΠΏ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π΅ΡΠ΅ ΠΎΠ΄Π½Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΆΡΡΠ½Π°Π»Π° β Π΄Π»Ρ ΠΎΡΠ»Π°Π΄ΠΊΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ, ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ Π½Π΅ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΡΡ .
Π‘ΡΡΠΎΠΊΠ°
logstring%merrnoΠ€ΡΠ½ΠΊΡΠΈΡ openlog(3) ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΡΡΠ΄ ΠΎΠΏΡΠΈΠΉ Π²Π΅Π΄Π΅Π½ΠΈΡ ΠΆΡΡΠ½Π°Π»Π°. ΠΠ½Π° ΠΈΠΌΠ΅Π΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅:
void openlog(char *ident, int logopt, int facility);Π‘ΡΡΠΎΠΊΠ°
identlogoptLOG_PID | ΠΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΏΡΠΎΡΠ΅ΡΡΠ° Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΈ. ΠΡΠ° ΠΎΠΏΡΠΈΡ ΠΏΠΎΠ»Π΅Π·Π½Π° ΠΏΡΠΈ ΠΆΡΡΠ½Π°Π»ΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ Π΄Π΅ΠΌΠΎΠ½ΠΎΠ² Ρ ΠΎΠ΄Π½ΠΈΠΌ ΠΈ ΡΠ΅ΠΌ ΠΆΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ ident, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΊΠΎΠ³Π΄Π° Π΄Π΅ΠΌΠΎΠ½Ρ ΠΏΠΎΡΠΎΠΆΠ΄Π°ΡΡΡΡ Π²ΡΠ·ΠΎΠ²ΠΎΠΌ fork(2). |
LOG_CONS | ΠΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π²ΡΠ²ΠΎΠ΄ΠΈΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π½Π° ΠΊΠΎΠ½ΡΠΎΠ»Ρ ΠΏΡΠΈ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π·Π°ΠΏΠΈΡΠΈ Π² ΠΆΡΡΠ½Π°Π». |
ΠΠ°ΠΊΠΎΠ½Π΅Ρ, Π°ΡΠ³ΡΠΌΠ΅Π½Ρ
facilityLOG_KERN | Π£ΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΡΡΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΎΡΠΏΡΠ°Π²Π»ΡΡΡΡΡ ΡΠ΄ΡΠΎΠΌ. |
LOG_USER | Π£ΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΡΡΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½Ρ ΠΏΡΠΈΠΊΠ»Π°Π΄Π½ΡΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠΌ (ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ). |
LOG_MAIL | Π£ΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΡΡΠΎ ΠΈΠ½ΠΈΡΠΈΠ°ΡΠΎΡΠΎΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΈΡΡΠ΅ΠΌΠ° ΡΠ»Π΅ΠΊΡΡΠΎΠ½Π½ΠΎΠΉ ΠΏΠΎΡΡΡ. |
LOG_DAEMON | Π£ΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΡΡΠΎ ΠΈΠ½ΠΈΡΠΈΠ°ΡΠΎΡΠΎΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΉ Π΄Π΅ΠΌΠΎΠ½. |
LOG_NEWS | Π£ΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΡΡΠΎ ΠΈΠ½ΠΈΡΠΈΠ°ΡΠΎΡΠΎΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΈΡΡΠ΅ΠΌΠ° ΡΠ΅Π»Π΅ΠΊΠΎΠ½ΡΠ΅ΡΠ΅Π½ΡΠΈΠΉ USENET. |
LOG_CRON | Π£ΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΡΡΠΎ ΠΈΠ½ΠΈΡΠΈΠ°ΡΠΎΡΠΎΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΈΡΡΠ΅ΠΌΠ° cron(1). |
ΠΠ°ΠΊΠΎΠ½ΡΠΈΠ² ΡΠ°Π±ΠΎΡΡ Ρ ΠΆΡΡΠ½Π°Π»ΠΎΠΌ, ΡΠ»Π΅Π΄ΡΠ΅Ρ Π°ΠΊΠΊΡΡΠ°ΡΠ½ΠΎ Π·Π°ΠΊΡΡΡΡ Π΅Π³ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ closelog(3):
void closelog(void);ΠΠΎΠΌΠ°Π½Π΄Π½ΡΠΉ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡ
ΠΠ»Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ° ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΌΡ Π²ΡΠ±ΡΠ°Π»ΠΈ ΠΏΡΠΎΡΡΠ΅ΠΉΡΠΈΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΡΠΉ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡ. ΠΠ°Π½Π½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΡΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΡ Π²ΡΠ·ΠΎΠ²ΠΎΠ² Π΄Π»Ρ ΠΏΠΎΡΠΎΠΆΠ΄Π΅Π½ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠ°, Π·Π°ΠΏΡΡΠΊΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΈ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ².
Π€ΡΠ½ΠΊΡΠΈΠΈ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡΠ° ΡΠ²Π΅Π΄Π΅Π½Ρ ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡΠΌΡ: ΠΎΠ½ ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π΅Ρ ΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄, ΠΎΡΡΠ°Π»ΡΠ½ΠΎΠΉ Π²Π²ΠΎΠ΄ ΠΎΠ½ ΡΠ°ΡΡΠ΅Π½ΠΈΠ²Π°Π΅Ρ ΠΊΠ°ΠΊ Π²Π½Π΅ΡΠ½ΠΈΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈ ΠΏΡΡΠ°Π΅ΡΡΡ Π·Π°ΠΏΡΡΡΠΈΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π° exec(2).
#include <sys/types.h>#include <sys/wait.h>#include <unistd.h>extern char** environ;#define CMDSIZE 80/* ΠΡΡΡΠΎΠ΅Π½Π½ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡΠ° */#define CD 1#define ECHO 2#define EXEC 3 ...#define PROGRAM 1000/* Π€ΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ Π°Π½Π°Π»ΠΈΠ· ΡΡΡΠΎΠΊΠΈ, Π²Π²Π΅Π΄Π΅Π½Π½ΠΎΠΉΒ Β ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ, Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΠΏΠΎΠ΄ΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ,Β Β Π²ΡΡΡΠΎΠ΅Π½Π½Π°Ρ Π»ΠΈ ΡΡΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΠ»ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°. Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°Β Β ΡΡΠ½ΠΊΡΠΈΡ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΡΡΡΠΎΠΊΡ cmdbuf, Π²Π²Π΅Π΄Π΅Π½Π½ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ,Β Β ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΈΠΌΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ/ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ path ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π½ΡΠ΅ Π΅ΠΉΒ Β ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ arguments. ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π½Π°Β Β Π²Π½ΡΡΡΠ΅Π½Π½ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΈΠ»ΠΈ Π²Π½Π΅ΡΠ½ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΊΠΎΡΠΎΡΡΡ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΒ Β Π·Π°ΠΏΡΡΡΠΈΡΡ.*/int parse_command(char* cmdbuf, char* path, char** arguments);main {Β charcmd[CMDSIZE];Β int command;Β int stat_loc;Β char** args;Β char cmdpath[MAXPATH];Β while (1) {Β /* ΠΡΠ²Π΅Π΄Π΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡΠ° */Β write(1, "$ ", 2);Β /* Π‘ΡΠΈΡΠ°Π΅ΠΌ Π²Π²ΠΎΠ΄ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈ ΠΏΡΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ ΡΡΡΠΎΠΊΡ */Β cmdsize = read(0, cmd, CMDSIZE);Β cmd[cmdsize-1] ='\0';Β command = parse_command(cmd, cmdpath, args);Β switch(command) {Β /* ΠΡΠ»ΠΈ ΡΡΠΎ Π²Π½ΡΡΡΠ΅Π½Π½ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π°, ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°Π΅ΠΌ Π΅Π΅ */Β case (CD):Β Β chdir(args[0]);Β Β break;Β case(ECHO):Β Β write(1, args[0], strlen(args[0]));Β Β break;Β case(EXEC):Β Β execve(path, args, environ);Β Β write(2, "shell: cannot execute", 21);Β Β break;Β Β ...Β Β /* ΠΡΠ»ΠΈ ΡΡΠΎ Π²Π½Π΅ΡΠ½ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°, ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ, ΠΊΠΎΡΠΎΡΡΠΉΒ Β Β Β ΠΈ Π·Π°ΠΏΡΡΡΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ */Β case(PROGRAM):Β Β pid = fork();Β Β if (pid < 0)Β Β Β write(2, "shell: cannot fork", 18);Β Β else if (pid == 0) {Β Β Β /* ΠΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ */Β Β Β execve(path, args, environ);