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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π―Π·Ρ‹ΠΊ программирования PerlΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 47

Автор ΠœΠΈΡ…Π°ΠΈΠ» Π¨ΠΎΡ…ΠΈΡ€Π΅Π²

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ всСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ заканчиваСтся, ΠΊΠΎΠ³Π΄Π° заканчиваСтся послСдний ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½Π½Ρ‹ΠΉ процСсс. ОТиданиС окончания выполнСния всСх Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… процСссов ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ wait(), которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ PID Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ²ΡˆΠ΅Π³ΠΎΡΡ подпроцСсса ΠΈ -1, Ссли всС процСссы-ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΠΈ Ρ€Π°Π±ΠΎΡ‚Ρƒ.

Π’ Perl Π΅ΡΡ‚ΡŒ нСсколько способов ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ взаимодСйствия процСссов ΠΏΡ€ΠΈ ΠΈΡ… ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ. Один ΠΈΠ· Π½ΠΈΡ… - ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠ°Π½Π°Π» (pipe), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдставляСт ΠΈΠ· сСбя Π΄Π²Π° Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… манипулятора - ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊ (reader) ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚Ρ‡ΠΈΠΊ (writer) - связанных Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎ записанныС Π² ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚Ρ‡ΠΈΠΊ Π΄Π°Π½Π½Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½Ρ‹ ΠΈΠ· ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠ°. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠ°Π½Π°Π» создаСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ pipe(), ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ ΠΈΠΌΠ΅Π½Π° Π΄Π²ΡƒΡ… Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… манипуляторов: ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠ° ΠΈ источника. Один ΠΈΠ· Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² взаимодСйствия процСссов Ρ‡Π΅Ρ€Π΅Π· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠ°Π½Π°Π» ΠΏΠΎΠΊΠ°Π·Π°Π½ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅:


use IO::Handle; # ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ стандартный ΠΌΠΎΠ΄ΡƒΠ»ΡŒ pipe(READER, WRITER); # создаСм ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠ°Π½Π°Π» WRITER->autoflush(1); # Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Π°Π²Ρ‚ΠΎ-очистку Π±ΡƒΡ„Π΅Ρ€Π° if ($pid = fork()) { # процСсс-ΠΏΡ€Π΅Π΄ΠΎΠΊ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ PID ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ° close READER; # ΠΏΡ€Π΅Π΄ΠΎΠΊ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈΠ· ΠΊΠ°Π½Π°Π»Π° print WRITER "Послано ΠΏΡ€Π΅Π΄ΠΊΠΎΠΌ (PID $$):\n"; for (my $n = 1; $n <= 5; $n++) { # запись Π² ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚Ρ‡ΠΈΠΊ print WRITER "$n "; } close WRITER; # Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ ΠΊΠ°Π½Π°Π» ΠΈ waitpid $pid, 0; # ΠΆΠ΄Π΅ΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ° } die "fork Π½Π΅ ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚Π°Π»: $!" unless defined $pid; if (!$pid) { # процСсс-ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ 0 close WRITER; # ΠΏΡ€Π΅Π΄ΠΎΠΊ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² ΠΊΠ°Π½Π°Π» print "ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ (PID $$) ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π»:\n"; while (my $line = <READER>) { # Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈΠ· ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠ° print "$line"; } close READER; # ΠΊΠ°Π½Π°Π» закрываСтся exit; # ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ }


Π’ΠΎ врСмя выполнСния этого ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π² стандартный Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π²Π΅Π΄Π΅Π½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:


ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ (PID -2032) ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π»: Послано ΠΏΡ€Π΅Π΄ΠΊΠΎΠΌ (PID 372): 1 2 3 4 5


Если Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ, организуСтся ΠΊΠ°Π½Π°Π», Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚Ρ‡ΠΈΠΊ Π±ΡƒΠ΄Π΅Ρ‚ Π² процСссС-ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ΅, Π° ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊ - Π² процСссС-ΠΏΡ€Π΅Π΄ΠΊΠ΅. Π’Π°ΠΊ ΠΊΠ°ΠΊ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΎΠ΄Π½ΠΎΠΌ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ, Ρ‚ΠΎ ΠΏΡ€ΠΈ нСобходимости двустороннСго ΠΎΠ±ΠΌΠ΅Π½Π° Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ процСссами ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Π΄Π²Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Ρ… ΠΊΠ°Π½Π°Π»Π° Π½Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ Π² ΠΎΠ±ΠΎΠΈΡ… направлСниях.

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

Π’ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСмах имССтся ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ процСссу ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΎ наступлСнии ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ события. Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ основан Π½Π° Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… сигналах. Π Π°Π±ΠΎΡ‚Π° с Π½ΠΈΠΌΠΈ происходит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Ρ‚ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠ³ΠΎ сигнала, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ автоматичСски вызываСтся, ΠΊΠΎΠ³Π΄Π° ОБ доставляСт сигнал процСссу. Π‘ΠΈΠ³Π½Π°Π»Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒΡΡ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмой, ΠΈΠ»ΠΈ ΠΎΠ΄ΠΈΠ½ процСсс ΠΌΠΎΠΆΠ΅Ρ‚ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ОБ ΠΏΠΎΡΠ»Π°Ρ‚ΡŒ сигнал Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ. ΠŸΡ€ΠΎΡ†Π΅ΡΡ, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ²ΡˆΠΈΠΉ сигнал, сам Ρ€Π΅ΡˆΠ°Π΅Ρ‚, ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Ρ€Π΅Π°Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° Π½Π΅Π³ΠΎ, - Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сигнал. ΠŸΠ΅Ρ€Π΅Ρ‡Π΅Π½ΡŒ сигналов, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, находится Π² ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΌ Ρ…ΡΡˆΠ΅ с ΠΈΠΌΠ΅Π½Π΅ΠΌ %SIG. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ допустимыС ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ сигналов ΠΌΠΎΠΆΠ½ΠΎ вывСсти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ keys(%SIG). ΠžΠ±Ρ‰Π΅ΠΈΠ·Π²Π΅ΡΡ‚Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ - сигнал прСрывания выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ INT, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ посылаСт ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ опСрационная систСма ΠΏΠΎ Π½Π°ΠΆΠ°Ρ‚ΠΈΡŽ Π½Π° консоли сочСтания клавиш Ctrl+C. Как ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ сигнала, ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сигнала INT:


# устанавливаСм ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сигнала INT $SIG{INT} = \&sig_handler; # ссылка Π½Π° ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ # Π½Π°Ρ‡Π°Π»ΠΎ основной ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ print "Π Π°Π±ΠΎΡ‚Π°ΡŽ Π² ΠΏΠΎΡ‚Π΅ Π»ΠΈΡ†Π°...\n" while (1); # бСсконСчный Ρ†ΠΈΠΊΠ» sub sig_handler { # ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°-ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сигнала $SIG{INT} = \&sig_handler; # пСрСустанавливаСм ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ print "ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ сигнал INT ΠΏΠΎ Π½Π°ΠΆΠ°Ρ‚ΠΈΡŽ Ctrl+C\n"; print "Π—Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ!\n"; exit; # Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ }


Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° сопровоТдаСтся Π²Ρ‹Π²ΠΎΠ΄ΠΎΠΌ сообщСний, ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π°ΡŽΡ‰ΠΈΡ… ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΠΏΠΎΡΡ‚ΡƒΠΏΠΈΠ²ΡˆΠ΅Π³ΠΎ сигнала:


Π Π°Π±ΠΎΡ‚Π°ΡŽ Π² ΠΏΠΎΡ‚Π΅ Π»ΠΈΡ†Π°... ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ сигнал INT ΠΏΠΎ Π½Π°ΠΆΠ°Ρ‚ΠΈΡŽ Ctrl+C Π—Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ!


ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰Π΅ΠΉΡΡ Π² бСсконСчном Ρ†ΠΈΠΊΠ»Π΅, ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ»ΡƒΠΆΠΈΡ‚ΡŒ любой сСрвСр, ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠΉ запросов ΠΎΡ‚ клиСнтских ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΈ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ свой ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» послС получСния ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ сигнала (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ HUP ΠΈΠ»ΠΈ USR1). Если Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ сигнал, Ρ‚ΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌΡƒ элСмСнту Ρ…ΡΡˆΠ° %SIG присваиваСтся строка 'IGNORE'. Π’ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΡƒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ сигнала ΠΌΠΎΠΆΠ½ΠΎ, присвоив ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌΡƒ элСмСнту %SIG строку 'DEFAULT'.

ΠŸΡ€ΠΎΡ†Π΅ΡΡ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡΡ‹Π»Π°Ρ‚ΡŒ сигналы самому сСбС, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для отслСТивания окончания Π·Π°ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄Π° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ (для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚Π°). Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ опСрация прСрываСтся ΠΏΠΎ истСчСнии ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΊΠ° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ:


# устанавливаСм ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сигнала ALRM (Π±ΡƒΠ΄ΠΈΠ»ΡŒΠ½ΠΈΠΊ) $SIG{ALRM} = sub { die "Timeout"; }; # анонимная ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° $timeout = 3600; # опрСдСляСм Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρƒ Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚Π° (сСк.) eval { # Π±Π»ΠΎΠΊ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠΉ ошибки alarm($timeout); # устанавливаСм врСмя ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ сигнала # нСкая Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ опСрация: print "Π Π°Π±ΠΎΡ‚Π°ΡŽ Π² ΠΏΠΎΡ‚Π΅ Π»ΠΈΡ†Π°...\n" while (1); alarm(0); # Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ }; # Π² ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ [email protected] - сообщСниС ΠΎΠ± ошибкС if ( [email protected] =~ /Timeout/) { # провСряСм ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρƒ ошибки print "Аварийный Π²Ρ‹Ρ…ΠΎΠ΄ ΠΏΠΎ истСчСнии Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ!"; }


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


my $parent = $$; # PID Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ процСсса my $pid = fork(); # 'Ρ€Π°Π·Π²Π΅Ρ‚Π²ΠΈΡ‚ΡŒ' Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ процСсс # fork Π²Π΅Ρ€Π½Π΅Ρ‚ PID ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ° Π² процСссС-ΠΏΡ€Π΅Π΄ΠΊΠ΅ ΠΈ 0 Π² ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ΅ die "fork Π½Π΅ ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚Π°Π»: $!" unless defined $pid; if ($pid) { # ---------- Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс ---------- print "Начался ΠΏΡ€Π΅Π΄ΠΎΠΊ PID $$\n"; for (1..3) { print "ΠŸΡ€Π΅Π΄ΠΎΠΊ PID $$ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ $_\n"; print "ΠŸΡ€Π΅Π΄ΠΎΠΊ PID $$ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠ» сигнал\n"; kill HUP, $pid; sleep 2; # 'Π·Π°ΡΠ½ΡƒΡ‚ΡŒ' Π½Π° 2 сСкунды } print "Закончился ΠΏΡ€Π΅Π΄ΠΎΠΊ (PID $$)\n"; } unless ($pid) { # ---------- Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ процСсс ---------- my $counter = 0; # счСтчик ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Ρ… сигналов $SIG{HUP} = sub { ### ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сигнала ### $counter++; print "\tΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» $counter-ΠΉ сигнал!\n"; }; ### ΠΊΠΎΠ½Π΅Ρ† ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° сигнала ### print "\tНачался ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ PID $$ ΠΏΡ€Π΅Π΄ΠΊΠ° $parent\n"; for (1..7) { print "\tΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ PID $$ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ $_\n"; sleep 1; # 'Π·Π°ΡΠ½ΡƒΡ‚ΡŒ' Π½Π° 1 сСкунду } print "\tЗакончился ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ PID $$\n"; }


ПовСдСниС этих процСссов Π²ΠΎ врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ ΠΏΠΎ Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌΡ‹ΠΌ ΠΈΠΌΠΈ сообщСниям:


Начался ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ PID -800 ΠΏΡ€Π΅Π΄ΠΊΠ° 696 ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ PID -800 Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ 1 Начался ΠΏΡ€Π΅Π΄ΠΎΠΊ PID 696 ΠŸΡ€Π΅Π΄ΠΎΠΊ PID 696 Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ 1 ΠŸΡ€Π΅Π΄ΠΎΠΊ PID 696 ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠ» сигнал ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» 1-ΠΉ сигнал! ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ PID -800 Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ 2 ΠŸΡ€Π΅Π΄ΠΎΠΊ PID 696 Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ 2 ΠŸΡ€Π΅Π΄ΠΎΠΊ PID 696 ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠ» сигнал ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ PID -800 Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ 3 ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» 2-ΠΉ сигнал! ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ PID -800 Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ 4 ΠŸΡ€Π΅Π΄ΠΎΠΊ PID 696 Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ 3 ΠŸΡ€Π΅Π΄ΠΎΠΊ PID 696 ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠ» сигнал ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ PID -800 Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ 5 ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» 3-ΠΉ сигнал! ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ PID -800 Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ 6 Закончился ΠΏΡ€Π΅Π΄ΠΎΠΊ (PID 696) ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ PID -800 Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ 7 Закончился ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ PID -800


Π‘ΠΈΠ³Π½Π°Π»Ρ‹ нСльзя ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ слишком Π½Π°Π΄Π΅ΠΆΠ½Ρ‹ΠΌ ΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌ срСдством ΠΎΠ±ΠΌΠ΅Π½Π° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ: для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ способы. Π—Π°Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ состояниС Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅Π³ΠΎ процСсса, ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠ² Π΅ΠΌΡƒ особый Π½ΡƒΠ»Π΅Π²ΠΎΠΉ сигнал Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ kill(0, $pid). Π­Ρ‚ΠΎΡ‚ Π²Ρ‹Π·ΠΎΠ² Π½Π΅ влияСт Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ процСсса-ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°, Π½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ истину (1), Ссли процСсс "ΠΆΠΈΠ²", ΠΈ лоТь (0), Ссли ΠΎΠ½ Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΡΡ ΠΈΠ»ΠΈ Π΅ΠΌΡƒ нСльзя ΠΏΠΎΡΡ‹Π»Π°Ρ‚ΡŒ сигналы. Одинаковая рСакция Π½Π° Π½ΡƒΠ»Π΅Π²ΠΎΠΉ сигнал гарантируСтся Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ…. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅Π³ΠΎ процСсса, ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠ² Π΅ΠΌΡƒ сигнал KILL Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ kill(KILL, $pid).

Π’ послСдних вСрсиях Perl появилась Π΅Ρ‰Π΅ ΠΎΠ΄Π½Π° модСль многозадачности - лСгковСсныС процСссы (light-weight processes), Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ управлСния ΠΈΠ»ΠΈ нитями. (По-английски Ρ„Ρ€Π°Π·Π° "Perl threads" Π·Π²ΡƒΡ‡ΠΈΡ‚ ΠΊΠ°ΠΊ ΠΊΠ°Π»Π°ΠΌΠ±ΡƒΡ€ ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π²Π΅Π΄Π΅Π½Π° ΠΊΠ°ΠΊ "Π½ΠΈΡ‚ΠΊΠΈ ΠΆΠ΅ΠΌΡ‡ΡƒΠ³Π°" ΠΈΠ»ΠΈ "ΠΆΠ΅ΠΌΡ‡ΡƒΠΆΠ½Ρ‹Π΅ ΠΎΠΆΠ΅Ρ€Π΅Π»ΡŒΡ"). Нити ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ ΠΎΡ‚ полновСсных процСссов с нСзависимыми рСсурсами Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΎΠ΄Π½ΠΎΠ³ΠΎ процСсса Π² Π΅Π΄ΠΈΠ½ΠΎΠΉ области памяти. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ созданиС Π½ΠΈΡ‚ΠΈ происходит быстрСС запуска ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ процСсса ΠΈ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ мСньшС рСсурсов ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы. Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π½ΠΈΡ‚Π΅ΠΉ Π² ΠΎΠ΄Π½ΠΎΠΉ области памяти позволяСт эффСктивно ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ совмСстный доступ ΠΊ раздСляСмым Π΄Π°Π½Π½Ρ‹ΠΌ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, программист ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Π½Π°Π΄ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΌΠΈΡΡ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ управлСния. ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅ Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ полновСсными процСссами, созданными ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмой, ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹ΠΌΠΈ нитями ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° рис. 16.1.

Рис. 16.1.  ΠŸΠΎΠ»Π½ΠΎΠ²Π΅ΡΠ½Ρ‹Π΅ процСссы ΠΈ Π½ΠΈΡ‚ΠΈ (ΠΏΠΎΡ‚ΠΎΠΊΠΈ управлСния)