Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Π°Ρ систСма UNIXΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 60

Автор РобачСвский АндрСй ΠœΠΈΡ…Π°ΠΉΠ»ΠΎΠ²ΠΈΡ‡

ПослСдний Ρ‚ΠΈΠΏ сообщСний подсказываСт Π΅Ρ‰Π΅ ΠΎΠ΄Π½Ρƒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ использования систСмного ΠΆΡƒΡ€Π½Π°Π»Π° β€” для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, особСнно Π½Π΅ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ….

Π‘Ρ‚Ρ€ΠΎΠΊΠ°

logstring
ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ элСмСнты форматирования, Ρ‚Π°ΠΊΠΈΠ΅ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ printf(3), с ΠΎΠ΄Π½ΠΈΠΌ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ
%m
, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ замСняСтся сообщСниСм, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ошибкС
errno
. ΠŸΡ€ΠΈ этом ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒΡΡ Π²Ρ‹Π²ΠΎΠ΄ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ².

Ѐункция openlog(3) позволяСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ряд ΠΎΠΏΡ†ΠΈΠΉ вСдСния ΠΆΡƒΡ€Π½Π°Π»Π°. Она ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅:

void openlog(char *ident, int logopt, int facility);

Π‘Ρ‚Ρ€ΠΎΠΊΠ°

ident
Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΡΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. АргумСнт
logopt
Π·Π°Π΄Π°Π΅Ρ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠΏΡ†ΠΈΠΈ, Π² Ρ‚ΠΎΠΌ числС:

LOG_PID
ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ процСсса Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ сообщСнии. Π­Ρ‚Π° опция ΠΏΠΎΠ»Π΅Π·Π½Π° ΠΏΡ€ΠΈ ΠΆΡƒΡ€Π½Π°Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π΄Π΅ΠΌΠΎΠ½ΠΎΠ² с ΠΎΠ΄Π½ΠΈΠΌ ΠΈ Ρ‚Π΅ΠΌ ΠΆΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ident, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΠ³Π΄Π° Π΄Π΅ΠΌΠΎΠ½Ρ‹ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°ΡŽΡ‚ΡΡ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ fork(2).
LOG_CONS
ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ сообщСния Π½Π° консоль ΠΏΡ€ΠΈ нСвозмоТности записи Π² ΠΆΡƒΡ€Π½Π°Π».

НаконСц, Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚

facility
позволяСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ источник сообщСний:

LOG_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);