Rechercher une page de manuel
wait
Langue: ru
Version: 24 июля 2000 (fedora - 25/11/07)
Section: 2 (Appels système)
Sommaire
ИМЯ
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)Contenus ©2006-2024 Benjamin Poulain
Design ©2006-2024 Maxime Vantorre