wait

Autres langues

Langue: ru

Autres versions - même langue

Version: 24 июля 2000 (fedora - 25/11/07)

Section: 2 (Appels système)

ИМЯ

wait, waitpid - ожидает завершения процесса

КРАТКАЯ СВОДКА

#include <sys/types.h>
#include <sys/wait.h>

pid_t wait(int *status)
pid_t waitpid(pid_t pid, int *status, int options);

ОПИСАНИЕ

Функция wait приостанавливает выполнение текущего процесса до тех пор, пока дочерний процесс не прекратит выполнение или до появления сигнала, который либо завершает текущий процесс, либо требует вызвать функцию-обработчик. Если дочерний процесс к моменту вызова функции уже завершился (так называемый "зомби"), то функция немедленно возвращается. Системные ресурсы, связанные с дочерним процессом, освобождаются.

Функция waitpid приостанавливает выполнение текущего процесса до тех пор, пока дочерний процесс, указанный в параметре pid, не завершит выполнение, или пока не появится сигнал, который либо завершает текущий процесс либо требует вызвать функцию-обработчик. Если указанный дочерний процесс к моменту вызова функции уже завершился (так называемый "зомби"), то функция немедленно возвращается. Системные ресурсы, связанные с дочерним процессом, освобождаются.

Параметр pid может принимать несколько значений:

< -1
означает, что нужно ждать любого дочернего процесса, чей идентификатор группы процессов равен абсолютному значению pid.
-1
означает ожидать любого дочернего процесса; функция wait ведет себя точно так же.
0
означает ожидать любого дочернего процесса, чей идентификатор группы процессов равен таковому у текущего процесса.
> 0
означает ожидать дочернего процесса, чем идентификатор равен pid.

Значение options создается путем битовой операции ИЛИ над следующими константами:

WNOHANG
означает вернуть управление немедленно, если ни один дочерний процесс не завершил выполнение.
WUNTRACED
означает возвращать управление также для остановленных дочерних процессов, о чьем статусе еще не было сообщено.

Если status не равен NULL, то функции wait и waitpid сохраняют информацию о статусе в переменной, на которую указывает status.

Этот статус можно исследовать с помощью нижеследующих макросов (они принимают в качестве аргумента буфер (типа int), --- а не указатель на буфер!):

WIFEXITED(status)
не равно нулю, если дочерний процесс нормально завершился.
WEXITSTATUS(status)
возвращает восемь младших битов возвращаемого значения завершившегося дочернего процесса. Эти биты могли быть установлены в аргументе функции exit() или в аргументе оператора return в функции main(). Этот макрос можно использовать, только если WIFEXITED вернул ненулевое значение.
WIFSIGNALED(status)
возвращает истинное значение, если дочерний процесс завершился из-за неперехваченного сигнала.
WTERMSIG(status)
возвращает номер сигнала, который привел к завершению дочернего процесса. Этот макрос можно использовать только если WIFSIGNALED вернул ненулевое значение.
WIFSTOPPED(status)
возвращает истинное значение, если дочерний процесс, из-за которого функция вернула управление, в настоящий момент остановлен; это возможно только если использовался флаг WUNTRACED.
WSTOPSIG(status)
возвращает номер сигнала, из-за которого дочерний процесс был остановлен. Этот макрос можно использовать только если WIFSTOPPED вернул ненулевое значение.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

Идентификатор дочернего процесса, который завершил выполнение, -1 в случае ошибки или нуль, если использовался WNOHANG, но ни один дочерний процесс еще не завершил выполнение (в этом случае errno устанавливается должным образом).

ОШИБКИ

ECHILD
процесс, указанный в pid, не существует или не является дочерним процессом текущего процесса. (Это может случиться и для собственного дочернего процесса, если обработчик сигнала SIGCHLD установлен в SIG_IGN. Смотри также главу ЗАМЕЧАНИЯ по поводу нитей.)
EINVAL
Аргумент options неверен.
ERESTARTSYS
Использовался флаг WNOHANG, и был пойман неблокированный сигнал или SIGCHLD. Эта ошибка возвращается системным вызовом. Библиотечные функции не могу вернуть ERESTARTSYS, но должны вернуть EINTR.

ЗАМЕЧАНИЯ

Стандарт Single Unix Specification описывает флаг SA_NOCLDWAIT (не реализован под Linux), такой, что если он установлен, или обработчик сигнала SIGCHLD установлен в SIG_IGN (что, кстати, не разрешено стандартном POSIX), то завершившиеся дочерние процессы не становятся зомби, а вызов wait() или waitpid() блокируется, пока все дочерние процессы не завершатся, а затем возвращает код ошибки, устанавливая errno в ECHILD.

В ядре Linux нити, управляемые ядром, устройством не отличаются от процесса. Нить -- это просто процесс, который создан уникальным (существующим только в Linux) системным вызовом clone(2); другие процедуры, такие как переносимая версия pthread_create(3), также реализованы с помощью clone(2). Таким образом, если процессы A и B являются братьями, нить A не может подождать с помощью wait() процесс, порожденный потоком B или его потомками, потому что дядя не может ждать с помощью wait() своих племянников. В некоторых Unix-подобных системах, где множественные нити реализованы как принадлежащие одиночному процессу, нить A может ждать с помощью wait() процессы, порожденные своей сестринской нитью B; вам придется переписать код, который делает такие допущения, чтобы он заработал под Linux.

СООТВЕТСТВИЕ СТАНДАРТАМ

SVr4, POSIX.1

СМОТРИ ТАКЖЕ

clone(2), signal(2), wait4(2), pthread_create(3), signal(7)