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

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

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

char form[]="это ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹Π²ΠΎΠ΄Π° строки ΠΈΠ· ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½Π½ΠΎΠ³ΠΎ процСсса";

main() {

 char output[128];

 int i;

 for (i = 0; i β€Ή 18; i++) {

  switch (fork()) {

  case -1: /* ошибка β€” ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ΅Π½ΠΎ максимальноС число процСссов */

   exit();

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

   break;

  case 0: /* ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½Π½Ρ‹ΠΉ процСсс */

   /* Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π²Ρ‹Π²ΠΎΠ΄Π° строки Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ output */

    sprintf(output, "%%d\n%s%d\n", form, i, form, i);

    for (;;) write(1, output, sizeof(output));

   }

 }

}

Рисунок 10.14. ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π΄Π°Π½Π½Ρ‹Ρ… Ρ‡Π΅Ρ€Π΅Π· стандартный Π²Ρ‹Π²ΠΎΠ΄


Рассмотрим ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΡƒΡŽ Π½Π° РисункС 10.14. Π ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс создаСт Π΄ΠΎ 18 ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½Π½Ρ‹Ρ… процСссов; ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½Π½Ρ‹Ρ… процСссов записываСт строку (с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sprintf) Π² массив output, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ сообщСниС ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ счСтчика i Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ выполнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ fork, ΠΈ Π·Π°Ρ‚Π΅ΠΌ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² Ρ†ΠΈΠΊΠ» пошаговой пСрСписи строки Π² Ρ„Π°ΠΉΠ» стандартного Π²Ρ‹Π²ΠΎΠ΄Π°. Если стандартным Π²Ρ‹Π²ΠΎΠ΄ΠΎΠΌ являСтся Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π», Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ Ρ€Π΅Π³ΡƒΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΠΎΡΡ‚ΡƒΠΏΠ°ΡŽΡ‰ΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ…. Выводимая строка ΠΈΠΌΠ΅Π΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ 64 символов Π² Π΄Π»ΠΈΠ½Ρƒ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ слишком Π²Π΅Π»ΠΈΠΊΠ° для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒΡΡ Π² символьном Π±Π»ΠΎΠΊΠ΅ (Π΄Π»ΠΈΠ½ΠΎΠΉ 64 Π±Π°ΠΉΡ‚Π°) Π² вСрсии V систСмы. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠΌΡƒ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Ρƒ трСбуСтся Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ символьного Π±Π»ΠΎΠΊΠ° для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ write, ΠΈΠ½Π°Ρ‡Π΅ Π²Ρ‹Π²ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚Π°Ρ‚ΡŒ искаТСнным. НапримСр, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ строки Π±Ρ‹Π»ΠΈ Ρ‡Π°ΡΡ‚ΡŒΡŽ Π²Ρ‹Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° машинС AT&T 3B20:


this is a sample output string from child 1

this is a sample outthis is a sample output string from child 0


Π§Ρ‚Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… с Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° Π² каноничСском Ρ€Π΅ΠΆΠΈΠΌΠ΅ Π±ΠΎΠ»Π΅Π΅ слоТная опСрация. Π’ Π²Ρ‹Π·ΠΎΠ²Π΅ систСмной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ read указываСтся количСство Π±Π°ΠΉΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ процСсс Ρ…ΠΎΡ‡Π΅Ρ‚ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ, Π½ΠΎ строковый интСрфСйс выполняСт Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ символа ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° ΠΊΠ°Ρ€Π΅Ρ‚ΠΊΠΈ, Π΄Π°ΠΆΠ΅ Ссли количСство символов Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½ΠΎ. Π­Ρ‚ΠΎ ΡƒΠ΄ΠΎΠ±Π½ΠΎ с практичСской Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ процСсс Π½Π΅ Π² состоянии ΠΏΡ€Π΅Π΄ΡƒΠ³Π°Π΄Π°Ρ‚ΡŒ, сколько символов ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Π²Π΅Π΄Π΅Ρ‚ с ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹, ΠΈ, с Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ смысла ΠΆΠ΄Π°Ρ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Π²Π΅Π΄Π΅Ρ‚ большоС число символов. НапримСр, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ вводят ΠΊΠΎΠΌΠ°Π½Π΄Π½Ρ‹Π΅ строки для ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠ³ΠΎ процСссора shell ΠΈ ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‚ ΠΎΡ‚Π²Π΅Ρ‚Π° shell'Π° Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ ΠΏΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ символа Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΊΠ°Ρ€Π΅Ρ‚ΠΊΠΈ. ΠŸΡ€ΠΈ этом Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ Ρ€Π°Π·Π½ΠΈΡ†Ρ‹, ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π»ΠΈ Π²Π²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ строки простыми ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ, Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ "date" ΠΈΠ»ΠΈ "who", ΠΈΠ»ΠΈ ΠΆΠ΅ это Π±ΠΎΠ»Π΅Π΅ слоТныС ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄, ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ:


pic file* | tbl | eqn | troff -mm -Taps | apsend


Π’Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ ΠΈ строковый интСрфСйс Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π·Π½Π°ΡŽΡ‚ ΠΎ синтаксисС ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠ³ΠΎ процСссора shell, ΠΈ это ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ с Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΠΎΠ² (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Ρ‹), ΠΈΠΌΠ΅ΡŽΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΉ синтаксис ΠΊΠΎΠΌΠ°Π½Π΄. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ строковый интСрфСйс выполняСт Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ символа Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΊΠ°Ρ€Π΅Ρ‚ΠΊΠΈ.

На РисункС 10.15 ΠΏΠΎΠΊΠ°Π·Π°Π½ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ чтСния с Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π» Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² каноничСском Ρ€Π΅ΠΆΠΈΠΌΠ΅; Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 10.3.3 Π±ΡƒΠ΄Π΅Ρ‚ рассмотрСна Ρ€Π°Π±ΠΎΡ‚Π° Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ Π±Π΅Π· ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. Если Π² настоящий ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π² любом ΠΈΠ· ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Ρ… списков для хранСния Π²Π²ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Π΄Π°Π½Π½Ρ‹Π΅, процСсс, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΉ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅, приостанавливаСтся Π΄ΠΎ поступлСния ΠΏΠ΅Ρ€Π²ΠΎΠΉ строки Π΄Π°Π½Π½Ρ‹Ρ…. Когда Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎΡΡ‚ΡƒΠΏΠ°ΡŽΡ‚, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ прСрывания ΠΎΡ‚ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° запускаСт "ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ прСрывания" строкового интСрфСйса, которая ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ Π² список для хранСния нСструктурированных Π²Π²ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ процСссам, ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡŽΡ‰ΠΈΠΌ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅, ΠΈ Π² список для хранСния Π²Ρ‹Π²ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Ρ… Π² качСствС эхосопровоТдСния Π½Π° Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π». Если ввСдСнная строка содСрТит символ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΊΠ°Ρ€Π΅Ρ‚ΠΊΠΈ, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ прСрывания возобновляСт Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ всСх приостановлСнных процСссов чтСния. Когда процСсс, ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡŽΡ‰ΠΈΠΉ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅, выполняСтся, Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ символы ΠΈΠ· списка для хранСния нСструктурированных Π²Π²ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ символы стирания ΠΈ удалСния ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ символы Π² каноничСский ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ список. Π—Π°Ρ‚Π΅ΠΌ ΠΎΠ½ ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ строку символов Π² адрСсноС пространство Π·Π°Π΄Π°Ρ‡ΠΈ Π΄ΠΎ символа Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΊΠ°Ρ€Π΅Ρ‚ΠΊΠΈ ΠΈΠ»ΠΈ Π΄ΠΎ исчСрпания числа символов, ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Π² Π²Ρ‹Π·ΠΎΠ²Π΅ систСмной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ read, Ρ‡Ρ‚ΠΎ встрСтится Ρ€Π°Π½ΡŒΡˆΠ΅. Однако, процСсс ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π΄Π°Π½Π½Ρ‹Ρ…, Ρ€Π°Π΄ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ½ Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²ΠΈΠ» своС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, большС Π½Π΅ сущСствуСт: Π΄Ρ€ΡƒΠ³ΠΈΠ΅ процСссы считали Π΄Π°Π½Π½Ρ‹Π΅ с Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° ΠΈ ΡƒΠ΄Π°Π»ΠΈΠ»ΠΈ ΠΈΡ… ΠΈΠ· списка для нСструктурированных Π²Π²ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ процСсс Π±Ρ‹Π» Π·Π°ΠΏΡƒΡ‰Π΅Π½ вновь. Вакая ситуация ΠΏΠΎΡ…ΠΎΠΆΠ° Π½Π° Ρ‚Ρƒ, которая ΠΈΠΌΠ΅Π΅Ρ‚ мСсто, ΠΊΠΎΠ³Π΄Π° ΠΈΠ· ΠΊΠ°Π½Π°Π»Π° ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ Π΄Π°Π½Π½Ρ‹Π΅ нСсколько процСссов.


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

{

 if (Π² каноничСском символьном спискС ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Π΄Π°Π½Π½Ρ‹Π΅) {

  do while (Π² спискС для нСструктурированных Π²Π²ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… отсутствуСт информация) {

   if (Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π» ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ "no delay" (Π±Π΅Π· Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ)) return;

   if (Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π» Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ Π±Π΅Π· ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ с использованиСм Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° ΠΈ Ρ‚Π°ΠΉΠΌΠ΅Ρ€ Π½Π΅ Π°ΠΊΡ‚ΠΈΠ²Π΅Π½)

    ΠΏΡ€Π΅Π΄ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ дСйствия ΠΊ Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° (Ρ‚Π°Π±Π»ΠΈΡ†Π° ΠΎΡ‚Π²Π΅Ρ‚Π½Ρ‹Ρ… сигналов);

   sleep (Π΄ΠΎ поступлСния Π΄Π°Π½Π½Ρ‹Ρ… с Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°);

  }

 /* Π² спискС для нСструктурированных Π²Π²ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π΅ΡΡ‚ΡŒ информация */

  if (Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π» Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ Π±Π΅Π· ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ)

   ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· списка для нСструктурированных Π²Π²ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π² каноничСский список;

  else { /* Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π» Π² каноничСском Ρ€Π΅ΠΆΠΈΠΌΠ΅ */

   do while (Π² спискС для нСструктурированных Π²Π²ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π΅ΡΡ‚ΡŒ символы) {

    ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ символу ΠΈΠ· списка для нСструктурированных Π²Π²ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π² каноничСский список: Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ символов стирания ΠΈ удалСния;

    if (символ β€” "Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΊΠ°Ρ€Π΅Ρ‚ΠΊΠΈ" ΠΈΠ»ΠΈ "ΠΊΠΎΠ½Π΅Ρ† Ρ„Π°ΠΉΠ»Π°") break; /* Π²Ρ‹Ρ…ΠΎΠ΄ ΠΈΠ· Ρ†ΠΈΠΊΠ»Π° */

   }

  }

 }

 do while(Π² каноничСском спискС Π΅Ρ‰Π΅ Π΅ΡΡ‚ΡŒ символы ΠΈ Π½Π΅ исчСрпано количСство символов, ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ Π² Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ read)

  ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ символы ΠΈΠ· ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ² каноничСского списка Π² адрСсноС пространство Π·Π°Π΄Π°Ρ‡ΠΈ;

}

Рисунок 10.15. Алгоритм чтСния с Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°


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


char input[256];

main() {

 register int i;

 for (i = 0; i β€Ή 18; i++) {

  switch (fork()) {

  case -1: /* ошибка */

   printf("опСрация fork Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π° ΠΈΠ·-Π·Π° ошибки\n");

   exit();

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

   break;

  case 0: /* ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½Π½Ρ‹ΠΉ процСсс */

   for (;;) {

    read(0, input, 256); /* Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ строки */

    printf("%d Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ %s\n",i,input);

   }

  }

 }

}

Рисунок 10.16. ΠšΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ†ΠΈΡ Π·Π° Π΄Π°Π½Π½Ρ‹Π΅, Π²Π²ΠΎΠ΄ΠΈΠΌΡ‹Π΅ с Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°


На РисункС 10.16 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅Ρ‚ нСсколько процСссов, ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡŽΡ‰ΠΈΡ… Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈΠ· Ρ„Π°ΠΉΠ»Π° стандартного Π²Π²ΠΎΠ΄Π°, конкурируя Π·Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ…, Π²Π²ΠΎΠ΄ΠΈΠΌΡ‹Ρ… с Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°. Π’Π²ΠΎΠ΄ с Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ осущСствляСтся слишком ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΠΈΡ‚ΡŒ всС процСссы, Π²Π΅Π΄ΡƒΡ‰ΠΈΠ΅ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅, поэтому процСссы Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ находятся Π² приостановлСнном состоянии Π² соотвСтствии с Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ terminal_read, оТидая Π²Π²ΠΎΠ΄Π° Π΄Π°Π½Π½Ρ‹Ρ…. Когда ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Π²ΠΎΠ΄ΠΈΡ‚ строку Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ ΠΎΡ‚ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° возобновляСт Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ всСх процСссов, Π²Π΅Π΄ΡƒΡ‰ΠΈΡ… Ρ‡Ρ‚Π΅Π½ΠΈΠ΅; ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ приостановлСны с ΠΎΠ΄Π½ΠΈΠΌ ΠΈ Ρ‚Π΅ΠΌ ΠΆΠ΅ ΡƒΡ€ΠΎΠ²Π½Π΅ΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°, ΠΎΠ½ΠΈ Π²Ρ‹Π±ΠΈΡ€Π°ΡŽΡ‚ΡΡ для запуска с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅ΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π΅ Π² состоянии ΠΏΡ€Π΅Π΄ΡƒΠ³Π°Π΄Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠ· процСссов выполняСтся ΠΈ считываСт строку Π΄Π°Π½Π½Ρ‹Ρ…; ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ созданный процСсс ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ i Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π΅Π³ΠΎ создания. ВсС Π΄Ρ€ΡƒΠ³ΠΈΠ΅ процСссы Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠ½Ρ†ΠΎΠ² Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°ΠΏΡƒΡ‰Π΅Π½Ρ‹, Π½ΠΎ Π²ΠΏΠΎΠ»Π½Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π½Π΅ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ°Ρ‚ Π²Π²Π΅Π΄Π΅Π½Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π² списках для хранСния Π²Π²ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΈΡ… Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ снова Π±ΡƒΠ΄Π΅Ρ‚ приостановлСно. Вся ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° повторяСтся для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π²Π²Π΅Π΄Π΅Π½Π½ΠΎΠΉ строки; нСльзя Π΄Π°Ρ‚ΡŒ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡŽ, Ρ‡Ρ‚ΠΎ Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· процСссов Π½Π΅ Π·Π°Ρ…Π²Π°Ρ‚ΠΈΡ‚ всС Π²Π²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅.