10.4.2. Наблюдение за уничтожением дочерних процессов

10.4.2. Наблюдение за уничтожением дочерних процессов

Сбор состояний возврата дочернего процесса называется ожиданием процесса. Это можно делать четырьмя способами, хотя только один из вызовов предоставляется ядром. Остальные три метода реализованы в стандартной библиотеке С. Поскольку системный вызов ядра принимает четыре аргумента, он называется wait4().

pid_t wait4(pid_t pid, int *status, int options, struct rusage *rusage);

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

pid < -1 Ожидать завершения любого дочернего процесса, чей pgid равен абсолютному значению pid.

pid = -1 Ожидать прерывания любого дочернего процесса.

pid = 0 Ожидать завершения дочернего из той же группы процессов, что и текущий[20].

pid > 0 Ожидать выхода процесса pid.

Второй параметр — это указатель на целое, которое устанавливается в значение, равное соду возврата того процесса, который заставляет wait4() вернуть управление (мы будем зазывать его "проверяемым" процессом). Формат возвращенного состояния довольно закрученный, и для того, чтобы сделать его осмысленным, существует набор макросов.

Три события заставляют wait4() вернуть состояние проверяемого процесса. Процесс может завершиться, он может быть прерван вызовом kill() (получит фатальный сигнал) либо он может быть остановлен по какой-либо причине[21]. Вы можете узнать, что именно случилось, с помощью описанных ниже макросов, каждый из которых принимает возвращаемое состояние wait4() в качестве единственного параметра.

WIFEXITED(status) Возвращает true, если процесс завершился нормально. Процесс завершается нормально, когда его функция main() выходит из программы посредством вызова exit(). Если WIFEXITED истинно, то WEXITSTATUS(status) возвращает код возврата процесса.
WIFSIGNALED(status) Возвращает true, если процесс был прерван сигналом (это происходит, когда он прерывается вызовом kill()). В этом случае WTERMSIG(status) возвращает номер сигнала, прервавшего процесс.
WIFSTOPPED(status) Если процесс приостановлен сигналом, WIFSTOPPED() возвращает true, a WSTOPSIG(status) возвращает номер сигнала, приостановившего процесс. wait4() возвращает информацию только о приостановленных процессах, если указана опция WUNTRACED.

Аргумент options управляет поведением вызова. WHOHANG заставляет функцию немедленно вернуть управление. Если в данный момент нет ни одного процесса, готового сообщить свое состояние, то возвращается 0 вместо допустимого pid. WUNTRACED заставляет wait4() возвратить соответствующий остановленный дочерний процесс. Более подробно о приостановленных процессах рассказывается в главе 15. Оба флажка могут быть объединены вместе битовой операцией "или".

Финальный параметр wait4(), указатель на struct rusage, наполняется информацией об использовании ресурсов проверяемым процессом и всеми его потомками. Более подробная информация об этом давалась при обсуждении getrusage() и RUSAGE_BOTH ранее в главе. Если этот параметр равен NULL, информация о состоянии не возвращается.

Существуют три других интерфейса к wait4(), каждый из которых представляет подмножество его функциональности.

pid_t wait(int *status) Единственный параметр wait() — это указатель на место, куда следует поместить код возврата прерванного процесса. Эта функция всегда блокирует выполнение до тех пор, пока дочерний процесс не будет прерван.
pid_t waitpid (pid_t pid, int *status, int options) Функция waitpid() подобна wait4(). Единственное отличие в том, что она не возвращает информации об использовании ресурсов прерванным процессом.
pid_t wait3(int *status, int options, struct rusage *rusage) Эта функция также подобна wait4(), но не позволяет специфицировать дочерний процесс, который должен быть проверен.
Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Систематическое научное наблюдение

Из книги Все под контролем: Кто и как следит за тобой автора Гарфинкель Симеон

Систематическое научное наблюдение Получение изображений со спутника, наземные видеокамеры и микрофоны, конечно, самые очевидные инструменты для наблюдения, но они не единственны в своем роде. Все шире для наблюдения начинают использоваться высокоточные научные


Создание дочерних окон

Из книги Язык программирования С# 2005 и платформа .NET 2.0. [3-е издание] автора Троелсен Эндрю

Создание дочерних окон Заключительным шагом должно быть создание подходящей реализации обработчика событий Файл?Создать родительской формы. Теперь, когда дочерняя форма определена, соответствующая программная логика оказывается очень простой: нужно создать и


Совет 7. При использовании контейнеров указателей, для которых вызывался оператор new, не забудьте вызвать delete для указателей перед уничтожением контейнера

Из книги Эффективное использование STL автора Мейерс Скотт

Совет 7. При использовании контейнеров указателей, для которых вызывался оператор new, не забудьте вызвать delete для указателей перед уничтожением контейнера Контейнеры STL отличаются умом и сообразительностью. Они поддерживают итераторы для перебора как в прямом, так и в


Настраиваем наблюдение за дисками

Из книги Сбои и ошибки ПК. Лечим компьютер сами автора Донцов Дмитрий

Настраиваем наблюдение за дисками Операционная система Windows ХР не зря считается одной из самых «устойчивых» систем. Наличие разнообразных механизмов защиты и наблюдения позволяет максимально защитить ее от различных непредвиденных ситуаций, которые могут стать


Обработка дочерних узлов

Из книги XSLT автора Хольцнер Стивен

Обработка дочерних узлов Элемент <xsl:apply-templates> дает указание процессору XSLT обрабатывать все совпадающие шаблоны для дочерних узлов контекстного узла. Элемент <xsl:apply-templates> дает возможность явно указать, когда следует закончить обработку дочерних узлов, а это имеет


Выбор дочерних элементов

Из книги Разработка приложений в среде Linux. Второе издание автора Джонсон Майкл К.

Выбор дочерних элементов При доступе к дочернему узлу определенного узла для разделения имен элементов можно использовать операцию шага /. Пусть, например, требуется создать правило, которое должно применяться только к тем элементам <NAME>, которые являются дочерними


10.4.1. Создание дочерних процессов

Из книги Как найти и скачать в Интернете любые файлы автора Райтман М. А.

10.4.1. Создание дочерних процессов В Linux предусмотрены два системных вызова, которые создают новые процессы: fork() и clone(). Как упоминалось ранее, clone() используется для создания потоков, и этот вызов будет кратко описан далее. А сейчас мы сосредоточимся на fork() — наиболее


Глава 8 Легально и абсолютно безопасно: советы для тех, кто не хочет попасть под наблюдение управления "К"

Из книги Раскрутка: секреты эффективного продвижения сайтов автора Евдокимов Николай Семенович

Глава 8 Легально и абсолютно безопасно: советы для тех, кто не хочет попасть под наблюдение управления "К" У каждого пользователя после покупки компьютера всегда возникает вопрос: а какое программное обеспечение установить на эту машину. Особенно такой вопрос актуален,


Наблюдение за действиями посетителей

Из книги Программирование для Linux. Профессиональный подход автора Митчелл Марк

Наблюдение за действиями посетителей Анализировать поведение посетителей на сайте крайне важно. Ведь нужно иметь представление о том, откуда приходит трафик и каков он, окупаются ли вложения в продвижение, какой процент посетителей проходит конверсионный сценарий


3.4.4. Асинхронное удаление дочерних процессов

Из книги UNIX: разработка сетевых приложений автора Стивенс Уильям Ричард

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


Эффект наличия слишком большого количества дочерних процессов

Из книги Взрыв обучения: Девять правил эффективного виртуального класса автора Мердок Мэттью

Эффект наличия слишком большого количества дочерних процессов В табл. 30.1 (строка 2) указано время (1,8 с), затрачиваемое центральным процессором в случае наличия 15 дочерних процессов, обслуживающих не более 10 клиентов. Мы можем оценить эффект «общей побудки», увеличивая


Эффект наличия слишком большого количества дочерних процессов

Из книги автора

Эффект наличия слишком большого количества дочерних процессов Мы можем проверить, возникает ли в данной версии сервера эффект «общей побудки», рассмотренный в предыдущем разделе. Как и раньше, время работы ухудшается пропорционально числу избыточных дочерних