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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «АрхитСктура ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы UNIXΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 62

Автор ΠœΠΎΡ€ΠΈΡ Π‘Π°Ρ…

#include β€Ήsignal.hβ€Ί

main(argc, argv)

int argc;

char *argv[];

{

 int i, ret_val, ret_code;

 if (argc β€Ί= 1) signal(SIGCLD, SIG_IGN); /* ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ гибСль ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ² */

 for (i = 0; i β€Ή 15; i++) if (fork() == 0) {

   /* процСсс-ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ */

   printf("процСсс-ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ %x\n", getpid());

   exit(i);

  }

  ret_val = wait(&ret_code);

  printf("wait ret_val %x ret_code %x\n", ret_val, ret_code);

}

Рисунок 7.17. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ wait ΠΈ игнорирования сигнала «гибСль ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°Β»


Π’ Ρ€Π°Π½Π½ΠΈΡ… вСрсиях систСмы UNIX Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ exit ΠΈ wait Π½Π΅ использовали ΠΈ Π½Π΅ рассматривали сигнал Ρ‚ΠΈΠΏΠ° «гибСль ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°Β». ВмСсто посылки сигнала функция exit возобновляла Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ процСсса. Если Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ wait приостановился, ΠΎΠ½ возобновляСтся, Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°, ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΠ²ΡˆΠ΅Π³ΠΎ сущСствованиС, ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС возобновлСния Π½Π΅ происходит; процСсс-Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ «погибшСго» ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ° ΠΏΡ€ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ wait. Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΈ процСсс Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ (init) ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ wait, ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΠ΅ΡΡ ΠΏΠΎ exit процСссы Π±ΡƒΠ΄ΡƒΡ‚ Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ Π΅Π³ΠΎ, Ссли ΠΎΠ½ ΠΈΠΌΠ΅Π΅Ρ‚ усыновлСнных ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ², ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π°ΡŽΡ‰ΠΈΡ… сущСствованиС.

Π’ Ρ‚Π°ΠΊΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ exit ΠΈ wait имССтся ΠΎΠ΄Π½Π° Π½Π΅Ρ€Π΅ΡˆΠ΅Π½Π½Π°Ρ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, связанная с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ процСссы, ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΠ²ΡˆΠΈΠ΅ сущСствованиС, нСльзя ΡƒΠ±ΠΈΡ€Π°Ρ‚ΡŒ ΠΈΠ· систСмы Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΈΡ… Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ Π½Π΅ исполнит Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ wait. Если процСсс создал мноТСство ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ², Π½ΠΎ Ρ‚Π°ΠΊ ΠΈ Π½Π΅ исполнил Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ wait, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΡ‚ΠΈ ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ процСссов ΠΈΠ·-Π·Π° наличия ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ², ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΠ²ΡˆΠΈΡ… сущСствованиС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ exit. Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° рассмотрим тСкст ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠ° процСссов, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π½Π° РисункС 7.18. ΠŸΡ€ΠΎΡ†Π΅ΡΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ считываниС Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· Ρ„Π°ΠΉΠ»Π° стандартного Π²Π²ΠΎΠ΄Π° Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ ΠΊΠΎΠ½Π΅Ρ† Ρ„Π°ΠΉΠ»Π°, создавая ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ исполнСнии Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ read Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°. Однако, процСсс-Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ Π½Π΅ доТидаСтся Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ стрСмится Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ процСссы Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ быстрСС, Ρ‚Π΅ΠΌ Π±ΠΎΠ»Π΅Π΅, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ довольно ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ процСсс-ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ своС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅. Если, ΠΎΠ±Ρ€Π°Ρ‚ΠΈΠ²ΡˆΠΈΡΡŒ ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ signal, процСсс распорядился ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сигналы Ρ‚ΠΈΠΏΠ° «гибСль ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°Β», ядро Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‡ΠΈΡ‰Π°Ρ‚ΡŒ записи, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΠ²ΡˆΠΈΠΌ сущСствованиС процСссам, автоматичСски. Π˜Π½Π°Ρ‡Π΅ Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅ ΠΈΠ·-Π·Π° Ρ‚Π°ΠΊΠΈΡ… процСссов ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΡ‚ΠΈ ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹.


#include β€Ήsignal.hβ€Ί

main(argc, argv) {

 char buf[256];

 if (argc != 1) signal(SIGCLD, SIG_IGN); /* ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ гибСль ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ² */

 while (read(0, buf, 256))

  if (fork() == 0) {

   /* здСсь процСсс-ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ выполняСт ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π°Π΄ Π±ΡƒΡ„Π΅Ρ€ΠΎΠΌ (buf) */

   exit(0);

 }

}

Рисунок 7.18. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ указания ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ появлСния сигнала «гибСль ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ²Β»

7.5 Π’Π«Π—ΠžΠ’ Π”Π Π£Π“Π˜Π₯ ΠŸΠ ΠžΠ“Π ΠΠœΠœ

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


execve(filename, argv, envp)


Π³Π΄Π΅ filename β€” имя исполняСмого Ρ„Π°ΠΉΠ»Π°, argv β€” ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° массив ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, Π° envp β€” ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° массив ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… срСду выполнСния Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π’Ρ‹Π·ΠΎΠ² систСмной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ exec ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡŽΡ‚ нСсколько Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ execl, execv, execle ΠΈ Ρ‚. Π΄. Π’ Ρ‚ΠΎΠΌ случаС, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки

main(argc, argv),

массив argv являСтся ΠΊΠΎΠΏΠΈΠ΅ΠΉ ΠΎΠ΄Π½ΠΎΠΈΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΠΎΠ³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ exec. Π‘ΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ строки, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ срСду выполнСния Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΈΠΌΠ΅ΡŽΡ‚ Π²ΠΈΠ΄ «имя=Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅Β» ΠΈ содСрТат ΠΏΠΎΠ»Π΅Π·Π½ΡƒΡŽ для ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, Ρ‚Π°ΠΊΡƒΡŽ ΠΊΠ°ΠΊ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈ ΠΏΡƒΡ‚ΡŒ поиска исполняСмых ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ. ΠŸΡ€ΠΎΡ†Π΅ΡΡΡ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌ описания срСды выполнСния, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ environ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π·Π°Π²ΠΎΠ΄ΠΈΡ‚ Π½Π°Ρ‡Π°Π»ΡŒΠ½Π°Ρ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° Π‘ΠΈ-ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°.


Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ exec

входная информация:

 (1) имя Ρ„Π°ΠΉΠ»Π°

 (2) список ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²

 (3) список ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… срСды

выходная информация: отсутствуСт

{

 ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ индСкс Ρ„Π°ΠΉΠ»Π° (Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ namei);

 ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, являСтся Π»ΠΈ Ρ„Π°ΠΉΠ» исполнимым ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ Π»ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΏΡ€Π°Π²ΠΎ Π½Π° Π΅Π³ΠΎ исполнСниС;

 ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΈΠ· Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² Ρ„Π°ΠΉΠ»Π° ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, являСтся Π»ΠΈ ΠΎΠ½ Π·Π°Π³Ρ€ΡƒΠ·ΠΎΡ‡Π½Ρ‹ΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ;

 ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈΠ· старого адрСсного пространства Π² систСмноС пространство;

 for (ΠΊΠ°ΠΆΠ΄ΠΎΠΉ области, присоСдинСнной ΠΊ процСссу)

  ΠΎΡ‚ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ всС старыС области (Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ detachreg);

 for (ΠΊΠ°ΠΆΠ΄ΠΎΠΉ области, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ Π² Π·Π°Π³Ρ€ΡƒΠ·ΠΎΡ‡Π½ΠΎΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅) {

  Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ области (Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ allocreg);

  ΠΏΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ области (Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ attachreg);

  Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΏΠΎ готовности (Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ loadreg);

 }

 ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π² Π½ΠΎΠ²ΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ стСка Π·Π°Π΄Π°Ρ‡ΠΈ;

 ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° для setuid-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, трассировка;

 ΠΏΡ€ΠΎΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ сохранСния рСгистров Π·Π°Π΄Π°Ρ‡ΠΈ (Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΈ ΠΊ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΡŽ Π² Ρ€Π΅ΠΆΠΈΠΌ Π·Π°Π΄Π°Ρ‡ΠΈ);

 ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ индСкс Ρ„Π°ΠΉΠ»Π° (Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ iput);

}

Рисунок 7.19. Алгоритм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ exec


На РисункС 7.19 прСдставлСн Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ выполнСния систСмной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ exec. Π‘Π½Π°Ρ‡Π°Π»Π° функция обращаСтся ΠΊ Ρ„Π°ΠΉΠ»Ρƒ ΠΏΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡƒ namei, провСряя, являСтся Π»ΠΈ Ρ„Π°ΠΉΠ» исполнимым ΠΈ ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΌ ΠΎΡ‚ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°, Π° Ρ‚Π°ΠΊΠΆΠ΅ провСряя Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Ρƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΏΡ€Π°Π²Π° ΠΈΡΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ. Π—Π°Ρ‚Π΅ΠΌ ядро, считывая Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Ρ„Π°ΠΉΠ»Π°, опрСдСляСт Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π² Ρ„Π°ΠΉΠ»Π΅ (Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Ρ„Π°ΠΉΠ»Π°).

На РисункС 7.20 ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ логичСский Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ исполняСмого Ρ„Π°ΠΉΠ»Π° Π² Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмС, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ транслятором ΠΈΠ»ΠΈ Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠΎΠΌ. Он разбиваСтся Π½Π° Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ части:

1. Π“Π»Π°Π²Π½Ρ‹ΠΉ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ, содСрТащий ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ‚ΠΎΠΌ, Π½Π° сколько Ρ€Π°Π·Π΄Π΅Π»ΠΎΠ² дСлится Ρ„Π°ΠΉΠ», Π° Ρ‚Π°ΠΊΠΆΠ΅ содСрТащий Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ адрСс исполнСния процСсса ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ «магичСскоС число», ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰Π΅Π΅ Ρ‚ΠΈΠΏ исполняСмого Ρ„Π°ΠΉΠ»Π°.

2. Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ Ρ€Π°Π·Π΄Π΅Π»ΠΎΠ², содСрТащиС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΡƒΡŽ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·Π΄Π΅Π» Π² Ρ„Π°ΠΉΠ»Π΅: Π΅Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€, Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ адрСса, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ½ располагаСтся, ΠΈ Π΄Ρ€.

3. Π Π°Π·Π΄Π΅Π»Ρ‹, содСрТащиС собствСнно Β«Π΄Π°Π½Π½Ρ‹Π΅Β» Ρ„Π°ΠΉΠ»Π° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, тСкстовыС), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°Π³Ρ€ΡƒΠΆΠ°ΡŽΡ‚ΡΡ Π² адрСсноС пространство процСсса.

4. Π Π°Π·Π΄Π΅Π»Ρ‹, содСрТащиС ΡΠΌΠ΅ΡˆΠ°Π½Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, Ρ‚Π°ΠΊΡƒΡŽ ΠΊΠ°ΠΊ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Π² процСссС ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ.

Рисунок 7.20. ΠžΠ±Ρ€Π°Π· исполняСмого Ρ„Π°ΠΉΠ»Π°


Π£ΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ с Ρ€Π°Π·Π²ΠΈΡ‚ΠΈΠ΅ΠΌ самой систСмы Π²ΠΈΠ΄ΠΎΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ, ΠΎΠ΄Π½Π°ΠΊΠΎ Π²ΠΎ всСх исполняСмых Ρ„Π°ΠΉΠ»Π°Ρ… ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ присутствуСт Π³Π»Π°Π²Π½Ρ‹ΠΉ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ с ΠΏΠΎΠ»Π΅ΠΌ Ρ‚ΠΈΠΏΠ° Ρ„Π°ΠΉΠ»Π°.

Π’ΠΈΠΏ Ρ„Π°ΠΉΠ»Π° обозначаСтся ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΌ Ρ†Π΅Π»Ρ‹ΠΌ числом (прСдставляСтся Π² машинС полусловом), ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ„Π°ΠΉΠ» ΠΊΠ°ΠΊ Π·Π°Π³Ρ€ΡƒΠ·ΠΎΡ‡Π½Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ, давая Ρ‚Π΅ΠΌ самым ядру Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ динамичСскиС характСристики Π΅Π³ΠΎ выполнСния. НапримСр, Π² машинС PDP 11/70 ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° Ρ„Π°ΠΉΠ»Π° ΠΊΠ°ΠΊ Π·Π°Π³Ρ€ΡƒΠ·ΠΎΡ‡Π½ΠΎΠ³ΠΎ модуля ΡΠ²ΠΈΠ΄Π΅Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΡƒΠ΅Ρ‚ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ процСсс, ΠΈΡΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΉ Ρ„Π°ΠΉΠ», ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΎ 128 ΠšΠ±Π°ΠΉΡ‚ памяти вмСсто 64 ΠšΠ±Π°ΠΉΡ‚[22], Ρ‚Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ Π² систСмах с Π·Π°ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ΠΌ страниц Ρ‚ΠΈΠΏ Ρ„Π°ΠΉΠ»Π° всС Π΅Ρ‰Π΅ ΠΈΠ³Ρ€Π°Π΅Ρ‚ ΡΡƒΡ‰Π΅ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ Ρ€ΠΎΠ»ΡŒ, Π² Ρ‡Π΅ΠΌ Π½Π°ΠΌ прСдстоит ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Π²ΠΎ врСмя знакомства с Π³Π»Π°Π²ΠΎΠΉ 9.

ВСрнСмся ΠΊ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡƒ. ΠœΡ‹ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΠ»ΠΈΡΡŒ Π½Π° Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ядро ΠΎΠ±Ρ€Π°Ρ‚ΠΈΠ»ΠΎΡΡŒ ΠΊ индСксу Ρ„Π°ΠΉΠ»Π° ΠΈ установило, Ρ‡Ρ‚ΠΎ Ρ„Π°ΠΉΠ» являСтся исполнимым. Π―Π΄Ρ€Ρƒ слСдовало Π±Ρ‹ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΡƒΡŽ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΌ контСкстом процСсса. Однако, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² памяти, ΠΏΠΎΠ΄Π»Π΅ΠΆΠ°Ρ‰Π΅ΠΉ освобоТдСнию, Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‚ΡΡ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Π΅ Π½ΠΎΠ²ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, ядро ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ Π΄Π΅Π»ΠΎΠΌ ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈΡ… ΠΈΠ· адрСсного пространства Π² ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ Π±ΡƒΡ„Π΅Ρ€ Π½Π° врСмя, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡ‚Π²Π΅Π΄Π΅Π½Ρ‹ области для Π½ΠΎΠ²ΠΎΠ³ΠΎ пространства памяти.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ exec Π²Ρ‹ΡΡ‚ΡƒΠΏΠ°ΡŽΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ адрСса массивов ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Ρ… строк, ядро ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ строкС сначала ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ Π² ΡΠΈΡΡ‚Π΅ΠΌΠ½ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ адрСс строки, Π° Π·Π°Ρ‚Π΅ΠΌ саму строку. Для хранСния строки Π² Ρ€Π°Π·Π½Ρ‹Ρ… вСрсиях систСмы ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π±Ρ€Π°Π½Ρ‹ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ мСста. Π§Π°Ρ‰Π΅ принято Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ строки Π² стСкС ядра (локальная структура Π΄Π°Π½Π½Ρ‹Ρ…, принадлСТащая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ядра), Π½Π° нСраспрСдСляСмых участках памяти (Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ страницы), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΎ внСшнСй памяти (Π½Π° устройствС Π²Ρ‹Π³Ρ€ΡƒΠ·ΠΊΠΈ).