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

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

Автор АндрСй РобачСвский

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

Π‘Ρ‚Ρ€ΠΎΠΊΠ° 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);

    write(2, "shell: cannot execute", 21);

   } else

    /* Π ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс */

    /* ОТидаСм Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ */

   wait(&stat_lock);

   break;

  }

 }

}

ΠŸΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Π½Ρ‹ΠΉ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² бСсконСчном Ρ†ΠΈΠΊΠ»Π΅, Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Ρ Π²Π²ΠΎΠ΄ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈ анализируя строку с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ parse_command(), тСкст ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ здСсь Π½Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½. Π’ случаС, Ссли ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Π²Π΅Π» Π²ΡΡ‚Ρ€ΠΎΠ΅Π½Π½ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°, ΠΎΠ½ выполняСт ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ собствСнными силами. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС shell ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅Ρ‚ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ процСсс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Ρ‹Π·ΠΎΠ²Π° execve(2) запускаСт ΡƒΠΊΠ°Π·Π°Π½Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ. Π’ это врСмя Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс выполняСт систСмный Π²Ρ‹Π·ΠΎΠ² wait(2) ΠΈ приостанавливаСт своС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π΄ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, послС Ρ‡Π΅Π³ΠΎ Π½Π° экран вновь выводится ΠΏΡ€ΠΈΠ³Π»Π°ΡˆΠ΅Π½ΠΈΠ΅.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π˜Π·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ систСма UNIX создавалась ΠΊΠ°ΠΊ срСда Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ. Π₯отя сСгодня UNIX примСняСтся Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… областях, Π½Π΅ связанных с Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния, эта опСрационная систСма ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ ΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ большой ΠΏΠΎΠΏΡƒΠ»ΡΡ€Π½ΠΎΡΡ‚ΡŒΡŽ срСди программистов. Π’ этой Π³Π»Π°Π²Π΅ рассмотрСны ΡƒΠΆΠ΅ извСстныС подсистСмы ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния ΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ интСрфСйса. Π’ ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ β€” это интСрфСйс систСмных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ², ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠΉ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ услуги, прСдоставляСмыС ядром систСмы ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½Ρ‹ΠΌ процСссам. ΠŸΡ€ΠΈ обсуТдСнии вопросов, связанных с ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π² UNIX Π±Ρ‹Π»ΠΈ ΠΏΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ полоТСния Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, написанными Π½Π° языкС Π‘ β€” стандартном языкС UNIX, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ написаны ядро ΠΈ основныС ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ систСмы.

Π“Π»Π°Π²Π° 3

ΠŸΠΎΠ΄ΡΠΈΡΡ‚Π΅ΠΌΠ° управлСния процСссами

Π‘Π΅Ρ€Π΄Ρ†Π΅ΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы UNIX являСтся подсистСма управлСния процСссами. ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈ всС дСйствия ядра ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ ΠΊ процСссам, Π±ΡƒΠ΄ΡŒ Ρ‚ΠΎ обслуТиваниС систСмного Π²Ρ‹Π·ΠΎΠ²Π°, гСнСрация сигнала, Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ памяти, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° особых ситуаций, Π²Ρ‹Π·Π²Π°Π½Π½Ρ‹Ρ… Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ процСсса ΠΈΠ»ΠΈ обСспСчСниСм услуг Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° ΠΏΠΎ запросу ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½ΠΎΠ³ΠΎ процСсса.

Вся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ счСтС опрСдСляСтся Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ Ρ‚Π΅Ρ… ΠΈΠ»ΠΈ ΠΈΠ½Ρ‹Ρ… процСссов. Π”Π°ΠΆΠ΅ Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ ΡƒΡ€ΠΎΠ²Π½ΠΈ выполнСния систСмы (run levels) ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой Π½ΠΈ Ρ‡Ρ‚ΠΎ ΠΈΠ½ΠΎΠ΅, ΠΊΠ°ΠΊ ΡƒΠ΄ΠΎΠ±Π½ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ опрСдСлСния Π³Ρ€ΡƒΠΏΠΏΡ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΡ…ΡΡ процСссов. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ сСтСвого доступа ΠΊ систСмС, Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ сСрвисы, Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹Π΅ для UNIX, β€” систСма ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ, ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Π΅ Π°Ρ€Ρ…ΠΈΠ²Ρ‹ FTP, элСктронная ΠΏΠΎΡ‡Ρ‚Π° ΠΈ систСма Ρ‚Π΅Π»Π΅ΠΊΠΎΠ½Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΠΉ (news) β€” всС это Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… процСссов.

Π’ этой Π³Π»Π°Π²Π΅ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ вопросы: Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ процСсс Π² прСдставлСнии ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы, ΠΊΠ°ΠΊΠΎΠ²Ρ‹ связанныС с Π½ΠΈΠΌ структуры Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠ΅ UNIX ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ процСссом, Π° Ρ‚Π°ΠΊΠΆΠ΅ описываСтся ΠΆΠΈΠ·Π½Π΅Π½Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» процСсса β€” ΠΎΡ‚ Π΅Π³ΠΎ создания Π΄ΠΎ прСкращСния выполнСния.

ΠŸΡ€ΠΎΡ†Π΅ΡΡΡ‹ Π² UNIX Π½Π΅ΠΎΡ‚ΡŠΠ΅ΠΌΠ»Π΅ΠΌΠΎ связаны с двумя ваТнСйшими рСсурсами систСмы β€” процСссором (ΠΈΠ»ΠΈ процСссорами) ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ. Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, этих рСсурсов Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π±Ρ‹Π²Π°Π΅Ρ‚ "ΠΌΠ½ΠΎΠ³ΠΎ", ΠΈ Π² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмС происходит активная конкурСнтная Π±ΠΎΡ€ΡŒΠ±Π° Π·Π° ΠΏΡ€Π°Π²ΠΎ обладания процСссором ΠΈ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ. ΠœΡ‹ рассмотрим ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ управлСния ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ, Ρ‚.ΠΊ. Π΄Π°ΠΆΠ΅ ΠΏΡ€ΠΈ самом ΡƒΠΌΠ΅Ρ€Π΅Π½Π½ΠΎΠΌ объСмС физичСской памяти адрСсноС пространство процСсса составляСт нСсколько Π³ΠΈΠ³Π°Π±Π°ΠΉΡ‚! ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ остановимся Π½Π° Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ опСрационная систСма ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ процСссов β€” вСдь Π² ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π² однопроцСссорной систСмС UNIX ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ процСсса. UNIX являСтся ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½ΠΎΠΉ систСмой ΠΎΠ±Ρ‰Π΅Π³ΠΎ назначСния, поэтому Π·Π°Π΄Π°Ρ‡Π° справСдливого распрСдСлСния этого рСсурса ΠΌΠ΅ΠΆΠ΄Ρƒ Π·Π°Π΄Π°Ρ‡Π°ΠΌΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ класса ΠΈ с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ трСбованиями являСтся Π½Π΅Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ.

ΠœΡ‹ познакомимся с Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Π½ΠΎΠ²Ρ‹Π΅ процСссы ΠΈ Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ Π½ΠΎΠ²Ρ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… Π³Π»Π°Π² Π²Ρ‹ ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ это Π½Π΅ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅). По сущСству процСсс являСтся "Ρ€Π°ΠΌΠΊΠΎΠΉ", Π² ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ "ΠΊΠ°Ρ€Ρ‚ΠΈΠ½Ρƒ" ΠΈΠ»ΠΈ "Ρ„ΠΎΡ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΡŽ" β€” Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ. Π’ этой Π³Π»Π°Π²Π΅ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π²Π°ΠΆΠ½Ρ‹Π΅ этапы ΠΆΠΈΠ·Π½ΠΈ процСсса, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ сон ΠΈ ΠΏΡ€ΠΎΠ±ΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅, ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ контСкста, связанного со смСной Π·Π°Π΄Π°Ρ‡ΠΈ, ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ Π΅Π³ΠΎ выполнСния.