Provided by: manpages-ru_0.98-4_all bug

ИМЯ

       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)