АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Ожидание процессом - предком завершения потомков

Читайте также:
  1. Главa 3. Основные требования к организациям железнодорожного транспорта и объектам железнодорожного транспорта. Управление перевозочным процессом
  2. Глава 14. Желание, убеждение и ожидание.
  3. Глава VII УПРАВЛЕНИЕ ПРОЦЕССОМ ПАБЛИК РИЛЕЙШНЗ
  4. Дата подготовки окончательной редакции Акта кадастровым инженером (дата завершения кадастровых работ) в формате число, месяц, год.
  5. Инструменты реализации решения и управления процессом.
  6. Интерпретация ответов испытуемого после завершения рисунка.
  7. Иосиф Иаковлевич и следы его потомков
  8. История Мусы с одним из потомков Израиля и египтянином
  9. Какие действия обязан предпринять работодатель после завершения расследования профессионального заболевания?
  10. ЛСГ «Названия, мотивированные процессом»
  11. Мат. ожидание дискретной случайной велечины и его свойства (включая теорему 1)
  12. Математическое ожидание дискретной случайной величины и его свойства (с выводом). Примеры.

Cистемный вызов wait() блокирует родительский процесс до момента завершения дочернего. При этом процесс-предок получает статус завершения процесса-потомка.

#include <sys/types.h>

#include <sys/wait.h>

pid_t wait(int *stat_loc);

. Вызов возвращает PID дочернего процесса. Обычно это дочерний процесс, который завершился. Сведения о состоянии позволяют родительскому процессу определить статус завершения дочернего процесса, т.е. значение, возвращенное из функции main потомка или переданное функции exit(). Если stat_loc не равен пустому указателю, информация о состоянии будет записана в то место, на которое указывает этот параметр.

Интерпретировать информацию о состоянии процесса можно с помощью макросов, описанных в файле sys/wait.h и приведенных в табл. 1

Таблица 1

  Макрос Описание
WIFEXITED(stat_val) Ненулевой, если дочерний процесс завершен нормально  
WEXITSTATUS(stat_val) Если WIFEXITED ненулевой, возвращает код завершения дочернего процесса  
WIFSIGNALED(stat_val) Ненулевой, если дочерний процесс завершается неперехватываемым сигналом  
WTERMSIG(stat_val) Если WIFSIGNALED ненулевой, возвращает номер сигнала  
WIFSTOPPED(stat_val) Ненулевой, если дочерний процесс остановился  
WSTOPSIG(stat_val) Если WIFSTOPPED ненулевой, возвращает номер сигнала  
         

 

Пример 2. Системный вызов wait()

В этом упражнении вы слегка измените программу, чтобы можно было подождать и проверить код состояния дочернего процесса. Назовите новую программу wait.c.

#include <sys/types.h>

#include <sys/wait.h>

Следующий фрагмент программы ждет окончания дочернего процесса:

if (pid > 0) {

int status;

pid_t child_pid;

child_pid = wait(&status);

printf("Child has finished: PID = %d\n", child_pid);

if (WIFEXITED(stat_val))

printf("Child exited with code %d\n", WEXITSTATUS(stat_val));

else printf("Child terminated abnormally\n");

}

Как это работает

Родительский процесс, получивший ненулевое значение, возвращенное из вызова fork(), применяет системный вызов wait() для приостановки своего выполнения до тех пор, пока информация о состоянии дочернего процесса не станет доступной. Затем родительский процесс продолжается и определяет, протестировав значение, возвращенное вызовом wait, что дочерний процесс завершился нормально, извлекает код завершения из информации о состоянии процесса.

Есть еще один системный вызов, который можно применять для ожидания дочернего процесса. Он называется waitpid() и применяется для ожидания завершения определенного процесса.

#include <sys/types.h>

#include <sys/wait.h>

pid_t waitpid(pid_t pid, int *stat_loc, int options);

Аргумент pid — конкретный дочерний процесс, окончания которого нужно ждать. Если он равен –1, waitpid() возвращает информацию о любом дочернем процессе. Как и вызов wait(), он записывает информацию о состоянии процесса в место, указанное аргументом stat_loc, если последний не равен пустому указателю. Аргумент options позволяет изменить поведение waitpid. Наиболее полезная опция WNOHANG мешает вызову waitpid() приостанавливать выполнение вызвавшего его процесса. Она применять для определения, завершился ли какой-либо из дочерних процессов, и если нет, то продолжать выполнение. Остальные опции такие же, как в вызове wait().

Итак, если вы хотите, чтобы родительский процесс периодически проверял, завершился ли конкретный дочерний процесс, можно использовать следующий вызов:

waitpid(child_pid, (int *)0, WNOHANG);

Он вернет ноль, если дочерний процесс не завершился и не остановлен, или child_pid, если это произошло. Вызов waitpid вернет -1 в случае ошибки и установит переменную errno. Это может произойти, если нет дочерних процессов (errno равна ECHILD), если вызов прерван сигналом (EINTR) или аргумент options неверный (EINVAL).

Задание 2: написать программу по схеме первого задания, но в процессе-предке выполнить системный вызов wait(). Убедиться, что в этом случае идентификатор процесса потомка на 1 больше идентификатора процесса-предка.


1 | 2 | 3 | 4 | 5 | 6 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.005 сек.)