ИМЯ
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