Rechercher une page de manuel

Chercher une autre page de manuel:

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)
Deux secondes, ce serait pas mal que vous me montriez le language perl,
pour que je le rende compatible avec le Multidesk, lisez la FAQ de notre
site (en bas de bage) pour savoir comment créer un language PERL sour le
Multidesk.
-- Jayce - Ah zut, je connais pas ce truc là. --