Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Пример Создания Процесса




Состояние завершения процесса

Если значение состояния выхода дочернего процесса - нуль, то значение состояния, сообщенное waitpid или wait - также нуль. Можно проанализировать другую информацию, закодированную в возвращенном значении состояния, используя следующие макрокоманды. Эти макрокоманды определены в заглавном файле "sys/wait.h".

int WIFEXITED (int status)

Эта макрокоманда возвращает значение отличное от нуля если дочерний процесс завершен exit или _exit.

int WEXITSTATUS (int status)

Если WIFEXITED - истина, эта макрокоманда возвращает 8 битов младшего разряда значения состояния выхода из дочернего процесса.

int WIFSIGNALED (int status)

Эта макрокоманда возвращает значение отличное от нуля, если дочерний процесс завершен потому, что он получил сигнал который не был обработан.

int WTERMSIG (int status)

Если WIFSIGNALED - истина, эта макрокоманда возвращает номер сигнала, который завершил дочерний процесс.

int WCOREDUMP (int status)

Эта макрокоманда возвращает значение отличное от нуля, если дочерний процесс завершен и произведен core-файл.

int WIFSTOPPED (int status)

Эта макрокоманда возвращает значение отличное от нуля, если дочерний процесс остановлен.

int WSTOPSIG (int status)

Если WIFSTOPPED - истина, эта макрокоманда возвращает номер сигнала, который заставил дочерний процесс остановиться.

Приведем пример программы, показывающий, как можно написать функцию, выполняющую внешнюю программу. Она выполняет аргумент command, используя " sh -c command ".

#include <stddef.h>

#include <stdlib.h>

#include <unistd.h>

#include <sys/types.h>

#include <sys/wait.h>

#define SHELL "/bin/sh"

int

my_system (const char *command)

{

int status;

pid_t pid;

pid = fork ();

if (pid == 0)

{

execl (SHELL, SHELL, "-c", command,

NULL);

_exit (EXIT_FAILURE);

}

else if (pid < 0)

status = -1;

else

if (waitpid (pid, &status, 0)!= pid)

status = -1;

return status;

}

 

В примере необходимо обратить внимание на следующее.

Первый аргумент argv, представляет имя выполняемой программы. Именно поэтому, в обращении к execl, SHELL встречается в вызове один раз, чтобы определить выполняемую программу, и второй раз, чтобы обеспечить значение для argv [0].

Вызов execl в дочернем процессе не возвращает управление, если он успешен. Если он терпит неудачу, необходимо выполнить определенные действия, чтобы заставить дочерний процесс завершиться. Правильное поведение для дочернего процесса - сообщить об ошибке родительскому процессу.

Вызовите _exit, чтобы выполнить это. Причина для использования _exit вместо exit состоит в том, чтобы избежать закрытия полностью буферизированных потоков типа stdout. Буфера этих потоков возможно содержат данные, которые были скопированы из родительского процесса функцией fork, эти данные будут выводиться в конечном счете родительским процессом. Вызов exit в дочернем вывел бы данные дважды.




Поделиться с друзьями:


Дата добавления: 2015-05-10; Просмотров: 276; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.007 сек.