Анимация
JavaScript
|
Главная Библионтека # МЕТОЛ 1... использование system: system("date"); # МЕТОЛ 2... использование fork/exec: unless (fork) { # fork выдала нуль, поэтому я - порожденный процесс и я выполняю: exec("date"); # порожденный процесс становится командой date Использовать fork и exec таким способом - не совсем правильно, потому что команда date и родительский процесс "пыхтят" одновременно, их результаты могут перемешаться и испортить все дело. Как дать родительскому процессу указание подождать, пока не завершится порожденный процесс? Именно это и делает функция wait; она ждет завершения данного (да и любого, если быть точным) порожденного процесса. Функция waitpid более разборчива: она ждет завершения не любого, а определенного порожденного процесса: If ( I defined ($kidpid = forkO) { # fork возвратила undef, т.е. неудача die "cannot fork: $i"; \ elsif ($pid == 0) ( # fork возвратила 0, поэтому данная ветвь - порожденный процесс exec("date"); # если exec терпит неудачу, перейти к следующему оператору die "cant exec date: } else { # fork возвратила не 0 и не undef, # поэтому данная ветвь - родительский процесс waitpid($kidpid, 0); > Если все это кажется вам слишком сложным, изучите системные вызовы fork(2) и ехес(2), отыскав материалы о них в каком-нибудь руководстве по ОС UNIX, noTONfy что Perl просто передает вызовы этих функций прямо в системные вызовы UNIX Функция exit обеспечивает немедленный выход из текущего Perl-процесса. Она используется для прерывания Perl-программы где-нибудь посередине или - вместе с функцией fork - для выполнения Perl-кода в процессе с последующим выходом. Вот пример удаления нескольких файлов из каталога /tmp в фоновом режиме с помощью порожденного Perl-процесса: unless (defined ($pid = fork)) { die "cannot fork: unless ($pid) ( unlink </tmp/badroc!<. *>; # удалить эти файлы exit; # порожденный процесс останавливается здесь # родительский процесс продолжается здесь waitpid($pid, 0); # после уничтожения порожденного процесса нужно все убрать Без использования функции exit порожденный процесс продолжал бы выполнять Perl-код (со строки "# родительский процесс продолжается здесь") - а как раз этого нам и не нужно. функция exit может иметь необязательный параметр, служащий числовым кодом выхода, который воспринимается родительским процессом По умолчанию выход производится с нулевым кодом, показывающим, что все прощло нормально. Сводка операций, проводимых над процессами Операции, служащие для запуска процессов, перечислены в таблице 14. Таблица 14 1 Операции запуска процессов
Самый простой способ создать процесс - использовать для этого функцию system На стандартный ввод, вывод и вывод ошибок это не влияет (они наследуются от Perl-процесса) Строка в обратных кавычках создает процесс и передает данные со стандартного вывода этого процесса как строковое значение для Perl-программы Стандартный ввод и стандартный вывод ошибок не изменяются Оба эти метода требуют завершения процесса до выполнения другого кода Простой способ получить асинхронный процесс (процесс, который позволяет продолжать выполнение Perl-программы до своего завершения) - открыть команду как дескриптор файла с созданием канала для стандартного ввода или стандартного вывода этой команды Команда, открытая как дескриптор файла для чтения, наследует стандартный ввод и стандартный вывод ошибок от Perl-программы, команда, открытая как дескриптор файла для записи, наследует от Perl-программы стандартный вывод и стандартный вывод ошибок Самый гибкий способ запустить процесс - заставить программу вызвать функции fork, exec И wait или waitpid, которые полностью соответствуют своим UNIX-тезкам С помощью этих функции вы можете запустить какой-либо процесс синхронно или асинхронно, а также конфигурировать по своему усмотрению стандартный ввод, стандартный вывод и стандартный вывод ошибок* Передача и прием сигналов Один из вариантов организации межпроцессного взаимодействия основан на передаче и приеме сигналов Сигнал - это одноразрядное сообщение (означающее, что "произошло данное событие"), которое посылается в процесс из другого процесса или из ядра Сигналам присваиваются номера, обычно из диапазона от единицы до небольшого числа, например 15 или 31 Одни сигналы (фиксированные) имеют предопределенное значение и посылаются в процесс автоматически при возникновении определенных \)бстоя-тельств (например, при сбоях памяти или в исключительных ситуациях, возникающих при выполнении операций с плавающей запятой) Другие сигналы генерируются исключительно пользователем из других процессов, но не из всех, а только их тех, которые имеют разрешение на передачу сигналов Передача сигнала разрешается только в том случае, если вы являетесь привилегированным пользователем или если передающий сигнал процесс имеет тот же идентификатор пользователя, что и принимающий Ответ на сигнал называется действием сигнала Фиксированные сигналы выполняют определенные действия по умолчанию, например, осуществляют прерывание или приостановку процесса Остальные сигналы по умолчанию Полезно также знать о формах типа open (stderr, ">4STD0aT") используемых для точной настройки дескрипторов файлов См пункт open в главе 3 книги Programming Perl ичк на man странице perlfunc(l) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 [ 60 ] 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |