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

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

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

7.11 Π£ΠŸΠ ΠΠ–ΠΠ•ΠΠ˜Π―

1. Π—апуститС с Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΡƒΡŽ Π½Π° РисункС 7.33. ΠŸΠ΅Ρ€Π΅Π°Π΄Ρ€Π΅ΡΡƒΠΉΡ‚Π΅ стандартный Π²Ρ‹Π²ΠΎΠ΄ Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ„Π°ΠΉΠ» ΠΈ сравнитС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΌΠ΅ΠΆΠ΄Ρƒ собой.


main() {

 printf("hello\nβ€œ);

 if (fork() == 0) printf("world\nβ€œ);

}

Рисунок 7.33. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ модуля, содСрТащСго Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ fork ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ стандартному Π²Ρ‹Π²ΠΎΠ΄Ρƒ


2. Π Π°Π·Π±Π΅Ρ€ΠΈΡ‚Π΅ΡΡŒ Π² ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π½Π° РисункС 7.34, ΠΈ сравнитС Π΅Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ с Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° РисункС 7.4.


#include β€Ήfcntl.hβ€Ί

int fdrd, fdwt;

char c;

main(argc, argv)

int argc; char *argv[];

{

 if (argc != 3) exit(1);

 fork();

 if ((fdrd = open(argv[1], O_RDONLY)) == -1) exit(1);

 if (((fdwt = creat(argv[2], 0666)) == -1) && ((fdwt = open(argv[2], O_WRONLY)) == -1)) exit(1);

 rdwrt();

}


rdwrt() {

 for (;;) {

  if (read(fdrd, &c, 1) != 1) return;

  write(fdwt, &c, 1);

 }

}

Рисунок 7.34. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ процСсс-Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ ΠΈ процСсс-ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ Π½Π΅ Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‚ доступ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ


3. Π•Ρ‰Π΅ Ρ€Π°Π· обратимся ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π½Π° РисункС 7.5 ΠΈ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ, ΠΊΠ°ΠΊ Π΄Π²Π° процСсса ΠΎΠ±ΠΌΠ΅Π½ΠΈΠ²Π°ΡŽΡ‚ΡΡ сообщСниями, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ спарСнныС ΠΊΠ°Π½Π°Π»Ρ‹. Π§Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚, Ссли ΠΎΠ½ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚Π°ΡŽΡ‚ΡΡ вСсти ΠΎΠ±ΠΌΠ΅Π½ сообщСниями, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΠ΄ΠΈΠ½ ΠΊΠ°Π½Π°Π»?

4. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Π° Π»ΠΈ потСря ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π² случаС, ΠΊΠΎΠ³Π΄Π° процСсс ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ нСсколько сигналов ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Π΅ΠΌΡƒ прСдоставляСтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΡ‚Ρ€Π΅Π°Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° Π½ΠΈΡ… Π½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ? (РассмотритС случай, ΠΊΠΎΠ³Π΄Π° процСсс подсчитываСт количСство ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Ρ… сигналов ΠΎ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΈ.) Π•ΡΡ‚ΡŒ Π»ΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π² Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹?

5. ΠžΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ систСмной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ kill.

6. ΠŸΡ€ΠΎΡ†Π΅ΡΡ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π½Π° РисункС 7.35 ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ сигналы Ρ‚ΠΈΠΏΠ° β€žΠ³ΠΈΠ±Π΅Π»ΡŒ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°β€œ ΠΈ устанавливаСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сигналов Π² исходноС состояниС. Π§Ρ‚ΠΎ происходит ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹?


#include β€Ήsignal.hβ€Ί

main() {

 extern catcher();

 signal(SIGCLD, catcher);

 if (fork() == 0) exit();

 /* ΠΏΠ°ΡƒΠ·Π° Π΄ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° получСния сигнала */

 pause();

}


catcher() {

 printf("процСсс-Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» сигнал\n");

 signal(SIGCLD, catcher);

}

Рисунок 7.35. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ процСсс ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ сигналы Ρ‚ΠΈΠΏΠ° β€žΠ³ΠΈΠ±Π΅Π»ΡŒ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°β€œ


7. ΠšΠΎΠ³Π΄Π° процСсс ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ сигналы ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΈ Π½Π΅ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΈΡ…, ядро Π΄Π°ΠΌΠΏΠΈΡ€ΡƒΠ΅Ρ‚ ΠΎΠ±Ρ€Π°Π· процСсса Π² Ρ‚ΠΎΠΌ Π²ΠΈΠ΄Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π» Ρƒ Π½Π΅Π³ΠΎ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ получСния сигнала. Π―Π΄Ρ€ΠΎ создаСт Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ процСсса Ρ„Π°ΠΉΠ» с ΠΈΠΌΠ΅Π½Π΅ΠΌ β€žcoreβ€œ ΠΈ ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ Π² Π½Π΅Π³ΠΎ пространство процСсса, области ΠΊΠΎΠΌΠ°Π½Π΄, Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ стСка. ВпослСдствии ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ Π΄Π°ΠΌΠΏ ΠΎΠ±Ρ€Π°Π·Π° процСсса с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ стандартных срСдств ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ. ΠžΠΏΠΈΡˆΠΈΡ‚Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π½Π° Π’Π°Ρˆ взгляд Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ ядро Π² процСссС создания Ρ„Π°ΠΉΠ»Π° β€žcoreβ€œ. Π§Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ Π² Ρ‚ΠΎΠΌ случаС, Ссли Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ Ρ„Π°ΠΉΠ» с Ρ‚Π°ΠΊΠΈΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΡƒΠΆΠ΅ сущСствуСт? Как Π΄ΠΎΠ»ΠΆΠ½ΠΎ вСсти сСбя ядро, ΠΊΠΎΠ³Π΄Π° Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈ Ρ‚ΠΎΠΌ ΠΆΠ΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ Π΄Π°ΠΌΠΏΠΈΡ€ΡƒΡŽΡ‚ свои ΠΎΠ±Ρ€Π°Π·Ρ‹ сразу нСсколько процСссов?

8. Π•Ρ‰Π΅ Ρ€Π°Π· обратимся ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ (Рисунок 7.12), ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰Π΅ΠΉ, ΠΊΠ°ΠΊ ΠΎΠ΄ΠΈΠ½ процСсс забрасываСт Π΄Ρ€ΡƒΠ³ΠΎΠΉ процСсс сигналами, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ΡΡ ΠΈΡ… адрСсатом. ΠŸΠΎΠ΄ΡƒΠΌΠ°ΠΉΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ Π±Ρ‹ Π² Ρ‚ΠΎΠΌ случаС, Ссли Π±Ρ‹ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сигналов Π±Ρ‹Π» ΠΏΠ΅Ρ€Π΅Ρ€Π°Π±ΠΎΡ‚Π°Π½ Π² любом ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΉ:

β€’ ядро Π½Π΅ замСняСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сигналов Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ явно Π½Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ этого;

β€’ ядро заставляСт процСсс ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сигналы Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π΅ обратится ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ signal вновь.

9. ΠŸΠ΅Ρ€Π΅Ρ€Π°Π±ΠΎΡ‚Π°ΠΉΡ‚Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сигналов Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ядро автоматичСски пСрСнастраивало процСсс Π½Π° ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ всСх ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… поступлСний сигналов ΠΏΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ ΠΈΡ…. Каким ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ядро ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сигналов, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰Π΅ΠΉΡΡ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ Π·Π°Π΄Π°Ρ‡ΠΈ? Π’Π°ΠΊΠΎΠ³ΠΎ Ρ€ΠΎΠ΄Π° пСрСнастройка ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΠ»Π° Π±Ρ‹ нас ΠΊ Ρ‚Ρ€Π°ΠΊΡ‚ΠΎΠ²ΠΊΠ΅ сигналов Π² систСмС BSD.

*10. Если процСсс ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ сигнал, Π½Π°Ρ…ΠΎΠ΄ΡΡΡŒ Π² состоянии приостанова Π²ΠΎ врСмя выполнСния систСмной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‰ΠΈΠΌ прСрывания ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ, ΠΎΠ½ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡƒ longjump. Π―Π΄Ρ€ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ установки для запуска Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сигнала; ΠΊΠΎΠ³Π΄Π° процСсс Π²Ρ‹ΠΉΠ΄Π΅Ρ‚ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сигнала, Π² вСрсии V это Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ, словно ΠΎΠ½ вСрнулся ΠΈΠ· систСмной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠΎΠΌ ошибки (ΠΊΠ°ΠΊ Π±Ρ‹ ΠΏΡ€Π΅Ρ€Π²Π°Π² своС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅). Π’ систСмС BSD систСмная функция Π² этом случаС автоматичСски пСрСзапускаСтся. Каким ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π² нашСй систСмС?

11. Π’ Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ mkdir для создания Π½ΠΎΠ²ΠΎΠΉ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ Π² Π΄Π΅Ρ€Π΅Π²Π΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ систСмная функция mknod, послС Ρ‡Π΅Π³ΠΎ Π΄Π²Π°ΠΆΠ΄Ρ‹ вызываСтся систСмная функция link, ΠΏΡ€ΠΈΠ²ΡΠ·Ρ‹Π²Π°ΡŽΡ‰Π°Ρ Ρ‚ΠΎΡ‡ΠΊΠΈ Π²Ρ…ΠΎΠ΄Π° Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ с ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ "." ΠΈ ".." ΠΊ Π½ΠΎΠ²ΠΎΠΉ Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ ΠΈ ΠΊ Π΅Π΅ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΌΡƒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Ρƒ. Π‘Π΅Π· этих Ρ‚Ρ€Π΅Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰ΠΈΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚. Π§Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚, Ссли Π²ΠΎ врСмя исполнСния ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ mkdir процСсс ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ сигнал? Π§Ρ‚ΠΎ Ссли ΠΏΡ€ΠΈ этом Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ сигнал SIGKILL, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ процСсс Π½Π΅ распознаСт? Π­Ρ‚Ρƒ ΠΆΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ рассмотритС ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ систСмной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ mkdir.

12. ΠŸΡ€ΠΎΡ†Π΅ΡΡ провСряСт Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ сигналов Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° Π² состояниС приостанова ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΈΠ· Π½Π΅Π³ΠΎ (Ссли Π² состоянии приостанова процСсс находился с ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ, Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‰ΠΈΠΌ прСрывания), Π° Ρ‚Π°ΠΊΠΆΠ΅ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° Π² Ρ€Π΅ΠΆΠΈΠΌ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΈΠ· Ρ€Π΅ΠΆΠΈΠΌΠ° ядра ΠΏΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ исполнСния систСмной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ»ΠΈ послС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ прСрывания. ΠŸΠΎΡ‡Π΅ΠΌΡƒ процСсс Π½Π΅ провСряСт Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ сигналов Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ обращСния ΠΊ систСмной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ?

*13. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ послС исполнСния систСмной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ процСсс готовится ΠΊ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΡŽ Π² Ρ€Π΅ΠΆΠΈΠΌ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΈ Π½Π΅ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Π΅Ρ‚ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π½Π΅ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½ΠΎΠ³ΠΎ сигнала. Π‘Ρ€Π°Π·Ρƒ послС этого ядро ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠ΅ ΠΈ посылаСт процСссу сигнал. (НапримСр, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ Π±Ρ‹Π»Π° Π½Π°ΠΆΠ°Ρ‚Π° клавиша "break".) Π§Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ процСсс послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ядро Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ прСрывания?

*14. Если процСссу ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ посылаСтся нСсколько сигналов, ядро ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΈΡ… Π² Ρ‚ΠΎΠΌ порядкС, Π² ΠΊΠ°ΠΊΠΎΠΌ ΠΎΠ½ΠΈ пСрСчислСны Π² описании. Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ‚Ρ€ΠΈ способа рСагирования Π½Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ сигнала β€” ΠΏΡ€ΠΈΠ΅ΠΌ сигналов, Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ выполнСния со сбросом Π½Π° внСшний Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒ (Π΄Π°ΠΌΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ) ΠΎΠ±Ρ€Π°Π·Π° процСсса Π² памяти ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ выполнСния Π±Π΅Π· дампирования. МоТно Π»ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π½Π°ΠΈΠ»ΡƒΡ‡ΡˆΠΈΠΉ порядок ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΏΠΎΡΡ‚ΡƒΠΏΠ°ΡŽΡ‰ΠΈΡ… сигналов? НапримСр, Ссли процСсс ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ сигнал ΠΎ Π²Ρ‹Ρ…ΠΎΠ΄Π΅ (Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Π΄Π°ΠΌΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π·Π° процСсса Π² памяти) ΠΈ сигнал ΠΎ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΈ (Π²Ρ‹Ρ…ΠΎΠ΄ Π±Π΅Π· дампирования), Ρ‚ΠΎ ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠ· этих сигналов ΠΈΠΌΠ΅Π»ΠΎ Π±Ρ‹ смысл ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ?

15. Π—Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅ Π½ΠΎΠ²ΡƒΡŽ ΡΠΈΡΡ‚Π΅ΠΌΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ newpgrp(pid,ngrp); которая Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ процСсс с ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ pid Π² Π³Ρ€ΡƒΠΏΠΏΡƒ процСссов с Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ ngrp (устанавливаСт для процСсса Π½ΠΎΠ²ΡƒΡŽ Π³Ρ€ΡƒΠΏΠΏΡƒ). ΠŸΠΎΠ΄ΡƒΠΌΠ°ΠΉΡ‚Π΅, для ΠΊΠ°ΠΊΠΈΡ… Ρ†Π΅Π»Π΅ΠΉ ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈ ΠΊΠ°ΠΊΠΈΠ΅ опасности Ρ‚Π°ΠΈΡ‚ Π² сСбС Π΅Π΅ Π²Ρ‹Π·ΠΎΠ².

16. ΠŸΡ€ΠΎΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅: ΠΏΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡƒ wait процСсс ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ Π΄ΠΎ наступлСния ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ события ΠΈ это Π½Π΅ ΠΎΡ‚Ρ€Π°Π·ΠΈΠ»ΠΎΡΡŒ Π±Ρ‹ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π΅ всСй систСмы.

17. Π Π°ΡΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ Π½ΠΎΠ²ΡƒΡŽ ΡΠΈΡΡ‚Π΅ΠΌΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ


nowait(pid);


Π³Π΄Π΅ pid β€” ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ процСсса, ΡΠ²Π»ΡΡŽΡ‰Π΅Π³ΠΎΡΡ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠΌ Ρ‚ΠΎΠ³ΠΎ процСсса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. Вызывая Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, процСсс Ρ‚Π΅ΠΌ самым сообщаСт ядру ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π½Π΅ собираСтся Π΄ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒΡΡ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ выполнСния своСго ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°, поэтому ядро ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎ ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠΈ сущСствования ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ° сразу ΠΆΠ΅ ΠΎΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΠΎΠ΅ ΠΈΠΌ мСсто Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ процСссов. Каким ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ это рСализуСтся Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅? ΠžΡ†Π΅Π½ΠΈΡ‚Π΅ достоинства Π½ΠΎΠ²ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ сравнитС Π΅Π΅ использованиС с использованиСм сигналов Ρ‚ΠΈΠΏΠ° "гибСль ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°".

18. Π—Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Π½Π° Π‘ΠΈ автоматичСски ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΊ основному ΠΌΠΎΠ΄ΡƒΠ»ΡŽ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΡƒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ (startup), которая Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ main, ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Если Π² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ отсутствуСт Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ exit, ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° startup сама Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΏΡ€ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main. Π§Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ Π±Ρ‹ Π² Ρ‚ΠΎΠΌ случаС, Ссли Π±Ρ‹ ΠΈ Π² ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π΅ startup отсутствовал Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ exit (ΠΈΠ·-Π·Π° ошибки Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠ°)?

19. ΠšΠ°ΠΊΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ процСсс, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ wait, Ссли Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ запустит Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ exit Π±Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°? Π˜ΠΌΠ΅Π΅Ρ‚ΡΡ Π² Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ процСсс-ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ exit() вмСсто exit(n). Если программист постоянно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ exit Π±Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, Ρ‚ΠΎ насколько прСдсказуСмо Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ wait? Π”ΠΎΠΊΠ°ΠΆΠΈΡ‚Π΅ свой ΠΎΡ‚Π²Π΅Ρ‚.

20. ΠžΠ±ΡŠΡΡΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚, Ссли процСсс, ΠΈΡΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π½Π° РисункС 7.36 запустит с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ exec самого сСбя. Как Π² Ρ‚Π°ΠΊΠΎΠΌ случаС ядро смоТСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ возникновСния Ρ‚ΡƒΠΏΠΈΠΊΠΎΠ²Ρ‹Ρ… ситуаций, связанных с Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ индСксов?


main(argc,argv)

int argc;

char *argv[];

{

 execl(argv[0], argv[0], 0);