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

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

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

Π’ΠΎ врСмя выполнСния процСссы ΠΌΠΎΠ³ΡƒΡ‚ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ собой Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ способами. Они ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ доступ ΠΊ раздСляСмой области памяти, ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Π΅ ΠΊΠ°Π½Π°Π»Ρ‹ (pipe), ΠΏΠΎΡΡ‹Π»Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Ρƒ сигналы (signal), ΠΎΠ±ΠΌΠ΅Π½ΠΈΠ²Π°Ρ‚ΡŒΡΡ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Ρ‡Π΅Ρ€Π΅Π· сокСты, совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ срСдства мСТпроцСссного взаимодСйствия (Inter-Process Communication, IPC). ΠŸΡ€ΠΈ этом часто ΠΎΠ΄ΠΈΠ½ процСсс ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ окончания выполнСния ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ дСйствий Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ процСссС: ΠΏΡ€ΠΎ Ρ‚Π°ΠΊΡƒΡŽ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ говорят, Ρ‡Ρ‚ΠΎ процСссы Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ синхронно (synchronous), Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ согласованно. Π’ Π΄Ρ€ΡƒΠ³ΠΈΡ… случаях трСбуСтся, Ρ‡Ρ‚ΠΎΠ±Ρ‹ процСссы Π²Ρ‹ΠΏΠΎΠ»Π½ΡΠ»ΠΈΡΡŒ асинхронно (asynchronous), Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΈ нСзависимо Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π°. Π’ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ процСсс ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΎΡ‚ асинхронного выполнСния ΠΊ синхронному, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π² ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ для синхронизации с Π΄Ρ€ΡƒΠ³ΠΈΠΌ процСссом.

РСализация этих ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠ² сильно зависит ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы, поэтому Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ стандартныС срСдства языка Perl, связанныС с ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ процСссами, ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ Π½Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΌ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ спСциализированныС Perl-ΠΌΠΎΠ΄ΡƒΠ»ΠΈ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с процСссами Π² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСмах, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… стандарту POSIX, ΠΈΠ»ΠΈ Π² ОБ MS Windows. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π² этой Π»Π΅ΠΊΡ†ΠΈΠΈ Π½Π°ΠΌ удастся ΠΎΠ±ΡΡƒΠ΄ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ основныС срСдства языка Perl, ΠΊΠ°ΡΠ°ΡŽΡ‰ΠΈΠ΅ΡΡ ΠΎΠ±ΡˆΠΈΡ€Π½ΠΎΠΉ Ρ‚Π΅ΠΌΡ‹ мСТпроцСссного взаимодСйствия. ΠŸΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠΌΡ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎ сдСланы максимально простыми, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ основныС ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρ‹ ΠΊ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΡŽ процСссами, избСгая особСнностСй, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΈΠ·ΠΎΠ±ΠΈΠ»ΡƒΠ΅Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅.

Π’ Perl имССтся опСрация выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, которая обозначаСтся ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΌΠΈ апострофами (backticks) ΠΈΠ»ΠΈ синонимом - конструкциСй qx(), ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π²ΡˆΠ΅ΠΉΡΡ Π² Π»Π΅ΠΊΡ†ΠΈΠΈ 7. Она ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° для получСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² выполнСния внСшнСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π­Ρ‚Π° опСрация пытаСтся Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π»ΡŽΠ±ΡƒΡŽ внСшнюю ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ окончания Π΅Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π² свой ΠΏΠΎΡ‚ΠΎΠΊ стандартного Π²Ρ‹Π²ΠΎΠ΄Π°. НапримСр, Ρ‚Π°ΠΊ Π² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСмах Linux ΠΈΠ»ΠΈ MS Windows ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ dir, Π²Ρ‹Π²ΠΎΠ΄ΡΡ‰ΡƒΡŽ список Ρ„Π°ΠΉΠ»ΠΎΠ² Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅:


my $file_list = `dir`; # Π² скалярном контСкстС my @file_list = qx(dir); # Π² списочном контСкстС


Π’ зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Π² ΠΊΠ°ΠΊΠΎΠΌ контСкстС - скалярном ΠΈΠ»ΠΈ списочном - употрСбляСтся опСрация выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ внСшнСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ рассматриваСтся ΠΊΠ°ΠΊ ΠΎΠ΄Π½Π° строка ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ список строк.

Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ внСшнюю ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ system, которая ΠΎΡ€Π³Π°Π½ΠΈΠ·ΡƒΠ΅Ρ‚ синхронный запуск ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΊΠΎΠ΄ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ. Код Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ 0 ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π° Π±Ρ‹Π»Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ. ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π΅Π΅ использования Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, Π°Ρ€Ρ…ΠΈΠ²ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ Ρ„Π°ΠΉΠ»Ρ‹ с суффиксом .pl Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅:


use English; # ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π»ΠΈΠ½Π½Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π° спСц. ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… # Π² ОБ MS Windows Π°Ρ€Ρ…ΠΈΠ²ΠΈΡ€ΡƒΠ΅ΠΌ Ρ„Π°ΠΉΠ»Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ pkzip if ($OSNAME =~ m/win/i) { system "pkzip", "-a", "pearls.zip", "*.pl"; # Π² ОБ GNU/Linux Π°Ρ€Ρ…ΠΈΠ²ΠΈΡ€ΡƒΠ΅ΠΌ Ρ„Π°ΠΉΠ»Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ tar ΠΈ gzip } elsif ($OSNAME =~ m/linux/i) { system "tar -cv *.pl | gzip > pearls.tar.gz"; }


ΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ с ΠΎΠ΄Π½ΠΈΠΌ строковым Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ функция system() ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ для запуска ΠΊΠΎΠΌΠ°Π½Π΄Π½Ρ‹ΠΉ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ exec(), open() ΠΈ опСрация qx(). ΠŸΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ Π΅ΠΉ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΎΠ½Π° запускаСт внСшнюю ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ систСмного Π²Ρ‹Π·ΠΎΠ²Π° (обращСния ΠΊ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмС). Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΡƒΡΠΏΠ΅ΡˆΠ½Ρ‹ΠΉ поиск запускаСмой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, Π³Π΄Π΅ находится ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, Π² список ΠΏΡƒΡ‚Π΅ΠΉ поиска. НапримСр, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:


{ # Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ с ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ Π² ΠΏΡƒΡ‚ΠΈ поиска local $ENV{"PATH"} = $path_to_the_program; # ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ system($program_to_execute); # Π²Ρ‹Π·ΠΎΠ² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ } # Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ $ENV{"PATH"} Π±ΡƒΠ΄Π΅Ρ‚ восстановлСно


Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π²Π½Π΅ΡˆΠ½ΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ open, Ссли трСбуСтся ΠΎΠ±ΠΌΠ΅Π½ΠΈΠ²Π°Ρ‚ΡŒΡΡ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ с этими ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°. Для этого Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ open() вмСсто ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π° пСрСдаСтся командная строка с ΠΈΠΌΠ΅Π½Π΅ΠΌ выполняСмой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ Π΅Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ. Если Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊ Π΄Π°Π½Π½Ρ‹Ρ… для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈΠ· Perl-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π΄ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ указываСтся символ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π° '|'. Как это дСлаСтся, Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· ΠΎΡ‡Π΅Π½ΡŒ простого ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ случайным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ числовыС ΠΏΠ°Ρ€ΠΎΠ»ΠΈ, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΎΠ½ΠΈ Π½Π°ΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ для сТатия Π² Π°Ρ€Ρ…ΠΈΠ² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ gzip:


# ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ, направляСм Π΅Π³ΠΎ внСшнСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ open my $archive, "| gzip > passwords.gz"; for (my $i = 1; $i <= 12; $i++) { # Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΠ°Ρ€ΠΎΠ»ΠΈ printf $archive "%06.0f\n", rand 999999; } close $archive; # Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ


Когда Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ внСшнСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π² Perl-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, Ρ‚ΠΎ символ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π° ΠΊΠΎΠΌΠ°Π½Π΄ '|' ставится Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки:


# ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ ΠΎΡ‚ внСшнСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ open my $archive, "gzip -d < passwords.gz |"; while (my $line = <$archive>) { # Ρ‡ΠΈΡ‚Π°Π΅ΠΌ ΠΏΠ°Ρ€ΠΎΠ»ΠΈ ΠΈΠ· Π°Ρ€Ρ…ΠΈΠ²Π° print $line; } close $archive; # Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ


(Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… Π°Ρ€Ρ…ΠΈΠ²Π°Ρ‚ΠΎΡ€ gzip распространяСтся свободно, вСрсии для самых Ρ€Π°Π·Π½Ρ‹Ρ… ОБ доступны Π½Π° сайтС http://www.gzip.org.)

Иногда трСбуСтся ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ: Π²Π½Π°Ρ‡Π°Π»Π΅ запускаСтся Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ, Π² зависимости ΠΎΡ‚ условий, Π·Π°Π΄Π°Π½Π½Ρ‹Ρ… Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, запускаСт вмСсто сСбя ΠΎΡΠ½ΠΎΠ²Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ. Π­Ρ‚ΠΎΡ‚ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ exec, которая замСняСт Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π½Π° ΡƒΠΊΠ°Π·Π°Π½Π½ΡƒΡŽ. Π’Π°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Perl-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠ΅ΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ:


print "ВыполняСтся Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊ: $0, PID:$$\n"; # Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π½Π° ΡƒΠΊΠ°Π·Π°Π½Π½ΡƒΡŽ my $program = $ARGV[0]; # имя ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² 1-ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π΅ print "ЗапускаСтся ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°: $program\n"; exec 'perl', $program or die; # запуск ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ print "Π­Ρ‚ΠΎ сообщСниС Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ напСчатаСтся!\n";


ΠŸΡ€ΠΈ запускС этого ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ 'proc_executed.pl' Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π²Π΅Π΄Π΅Π½Ρ‹ Ρ‚Π°ΠΊΠΈΠ΅ сообщСния:


ВыполняСтся Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊ: proc_exec.pl, PID:652 ЗапускаСтся ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°: proc_executed.pl ВыполняСтся ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°: proc_executed.pl, PID:1872


Для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ выполнСния процСссов Π² Perl ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ функция fork ("Ρ€Π°Π·Π²Π΅Ρ‚Π²ΠΈΡ‚ΡŒ"). Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π΅Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ создаСтся копия Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰Π΅Π³ΠΎΡΡ процСсса, которая Ρ‚ΠΎΠΆΠ΅ запускаСтся Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅. Для этого Π² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСмах сСмСйства Unix происходит ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ систСмному Π²Ρ‹Π·ΠΎΠ²Ρƒ fork. Π’ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСмах Ρ€Π°Π±ΠΎΡ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ fork() организуСтся ΠΈΡΠΏΠΎΠ»Π½ΡΡŽΡ‰Π΅ΠΉ систСмой Perl. Ѐункция fork() Π² Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΌ процСссС Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ PID Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅Π³ΠΎ процСсса, число 0 - Π² Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅ΠΌ процСссС ΠΈ Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ нСвозмоТности Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹ΠΉ процСсс. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ провСряСтся Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… дСйствий Π² процСссС-ΠΏΡ€Π΅Π΄ΠΊΠ΅ ΠΈ процСссС-ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ΅. Как это дСлаСтся, ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ схСматичном ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ (Π³Π΄Π΅ ΠΎΠ±Π° процСсса Π² Ρ†ΠΈΠΊΠ»Π΅ выводят числа, Π½ΠΎ с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ°ΠΌΠΈ):


my $pid = fork(); # 'Ρ€Π°Π·Π²Π΅Ρ‚Π²ΠΈΡ‚ΡŒ' Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ процСсс # fork Π²Π΅Ρ€Π½Π΅Ρ‚ 0 Π² ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ΅ ΠΈ PID ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ° Π² процСссС-ΠΏΡ€Π΅Π΄ΠΊΠ΅ die "fork Π½Π΅ ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚Π°Π»: $!" unless defined $pid; unless ($pid) { # процСсс-ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ print "Начался ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ PID $$\n"; for (1..3) { print "ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ PID $$ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ $_\n"; sleep 2; # 'Π·Π°ΡΠ½ΡƒΡ‚ΡŒ' Π½Π° 2 сСкунды } print "Закончился ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ PID $$\n"; exit; } if ($pid) { # процСсс-ΠΏΡ€Π΅Π΄ΠΎΠΊ print "Начался ΠΏΡ€Π΅Π΄ΠΎΠΊ PID $$\n"; for (1..3) { print "ΠŸΡ€Π΅Π΄ΠΎΠΊ PID $$ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ $_\n"; sleep 1; # 'Π·Π°ΡΠ½ΡƒΡ‚ΡŒ' Π½Π° 1 сСкунду } # Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, здСсь Π½ΡƒΠΆΠ½ΠΎ ΠΆΠ΄Π°Ρ‚ΡŒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°: # print "ΠŸΡ€Π΅Π΄ΠΎΠΊ PID $$ ΠΆΠ΄Π΅Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ $pid\n"; # waitpid $pid, 0; print "Закончился ΠΏΡ€Π΅Π΄ΠΎΠΊ PID $$\n"; }


По сообщСниям, Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌΡ‹ΠΌ ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ этого ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΠΈ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½Π½Ρ‹ΠΉ процСссы Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ. Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΌ процСссС ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅Π³ΠΎ процСсса, примСняСтся функция waitpid(), ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ пСрСдаСтся PID процСсса-ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ° (Π° Ρ‚Π°ΠΊΠΆΠ΅, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹). По Π²Ρ‹Π΄Π°Π²Π°Π΅ΠΌΡ‹ΠΌ сообщСниям сравнитС Π΄Π²Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° выполнСния ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ - Π±Π΅Π· оТидания Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅Π³ΠΎ процСсса ΠΈ с ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ процСсса-ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ° (для этого Π½ΡƒΠΆΠ½ΠΎ Ρ€Π°ΡΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΡ‚ΡŒ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ waitpid):


Π‘Π΅Π· оТидания ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ° Π‘ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ΠΌ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ° ΠΏΠΎ waitpid() ---------------------------- -------------------------------- Начался ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ PID -1024 Начался ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ PID -1908 ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ PID -1024 Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ 1 ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ PID -1908 Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ 1 Начался ΠΏΡ€Π΅Π΄ΠΎΠΊ PID 1504 Начался ΠΏΡ€Π΅Π΄ΠΎΠΊ PID 1876 ΠŸΡ€Π΅Π΄ΠΎΠΊ PID 1504 Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ 1 ΠŸΡ€Π΅Π΄ΠΎΠΊ PID 1876 Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ 1 ΠŸΡ€Π΅Π΄ΠΎΠΊ PID 1504 Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ 2 ΠŸΡ€Π΅Π΄ΠΎΠΊ PID 1876 Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ 2 ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ PID -1024 Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ 2 ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ PID -1908 Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ 2 ΠŸΡ€Π΅Π΄ΠΎΠΊ PID 1504 Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ 3 ΠŸΡ€Π΅Π΄ΠΎΠΊ PID 1876 Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ 3 Закончился ΠΏΡ€Π΅Π΄ΠΎΠΊ PID 1504 ΠŸΡ€Π΅Π΄ΠΎΠΊ PID 1876 ΠΆΠ΄Π΅Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ -1908 ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ PID -1024 Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ 3 ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ PID -1908 Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ 3 Закончился ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ PID -1024 Закончился ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ PID -1908 Закончился ΠΏΡ€Π΅Π΄ΠΎΠΊ PID 1876


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