Анимация
JavaScript


Главная  Библионтека 

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

# МЕТОЛ 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()

Наследуется

Наследуется

Наследуется

от программы

от программы

от программы

Строка в

Наследуется

Принимается

Наследуется

обратных

от программы

как строковое

от программы

кавычках

значение

Запуск

Соединен с

Наследуется

Наследуется

Только во

процесса

дескриптором

от программы

от программы

время вы-

как деск-

файла

полнения

риптора

close ()

файла для

вывода при

помощи

команды

open ()

Запуск

Наследуется

Соединен с

Наследуется

Только во

процесса

от программы

дескриптором

от программы

время вы-

как деск-

файла

полнения

риптора

close ()

файла для

ввода при

помощи

команды

open 0

f огх.

Выбирается

Выбирается

Выбирается

Выбирается

exec,

пользователем

пользователем

пользователем

пользователем

wait,

waitpid



Самый простой способ создать процесс - использовать для этого функцию 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