Часто родительскому процессу необходимо обладать информацией о завершении работы своего потомка. Например, когда командный интерпретатор, исполняя команду, порождает интерактивный процесс (переводящий ввод и вывод на себя) и, становясь его родителем, должен ждать завершения своего потомка, чтобы после этого вновь быть готовым ко вводу очередной команды. Когда завершается фоновый процесс, командному интерпретатору может потребоваться сообщить об этом пользователю (выводом соответствующего сообщения на терминал). Командный интерпретатор так же может запрашивать статус выхода процесса-потомка, так как дальнейшие действия пользователя зависят от того, завершился ли процесс успешно или имела место ошибка. В системах UNIX поддерживаются следующие системные вызовы, дающие возможность отслеживания завершения работы процессов:
wait(statjoc): /* System V. BSD и POSIX.1 */ wait3(statusp. options, rusagep): /* BSD */ waitpid(pid, statjoc. options): /* POSIX.1 */ waitid(idtype. id. infop. options): /* SVR4 */'
Системный вызов wait позволяет процессу ожидать завершения работы его потомка. Так как потомок может уже оказаться завершенным к моменту совершения вызова, то ему необходимо уметь распознавать такую ситуацию. После запуска вызов wait первоначально проверяет, имеет ли вызывающий его процесс потомков, функционирование которых завершено или приостановлено. Если он находит такие процессы, то немедленно происходит возврат из этого системного вызова. Если таких процессов нет, то wait блокирует вызвавший его процесс до тех пор, пока один из потомков не завершит свою работу, после чего последует возврат из вызова. В обоих случаях вызов wait возвратит PID завершившегося процесса, запишет его статус выхода в stat_loc и освободит его структуру ргос (если более одного процесса-потомка завершили свою работу, wait обработает только первый из найденных). Если процесс-потомок находится в режиме трассировки, возврат из wait также произойдет, когда процесс-потомок получит сигнал. Ошибку wait вернет в случае, когда родительский процесс не имеет ни одного потомка (функционирующего или уже завершенного) либо если его работа была прервана поступившим сигналом.
В операционной системе SVR4 поддержка команд wait3 и waitpid реализована в виде библиотечных функций. Так же рекоммендуем Вам прочитать новости экономики на другом портале. Система 4.3BSD поддерживает вызов wait3 (названный так потому, что он имеет три аргумента), который также возвращает информацию об использовании ресурсов потомком (время работы в режиме ядра и в режиме задачи процесса-потомка, а также о всех его завершенных потомках). В стандарте POSIX.1 [6] описан системный вызов waitpid, в котором используется аргумент pid для ожидания потомка, имеющего определенный идентификатор процесса или группы процесса. Системные вызовы wait3 и waitpid поддерживают две опции: WN0HANG и WUNTRACED. Опция WN0HANG заставляет вызов wait3 немедленно завершить работу, если он не нашел ни одного завершившегося процесса. Опция WUNTRACED завершает работу вызова, если потомок приостанавливается, или вновь продолжает функционирование. В ОС SVR4 системный вызов waitid поддерживает все вышеописанные возможности. Он позволяет вызывающему его процессу задавать PID или GID процесса, завершения которого должен ждать, а также определять события, по которым также произойдет возврат из вызова. Возвращает более подробную информацию о процессе-потомке.