Основы программирования в Linux
Основы программирования в Linux читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
<b>#include <sys/types.h></b><b>#include <sys/wait.h></b><b>pid_t wait(int *stat_loc);</b>Системный вызов
waitmainexitstat_locИнтерпретировать информацию о состоянии процесса можно с помощью макросов, описанных в файле sys/wait.h и приведенных в табл. 11.2.
Таблица 11.2
| Макрос | Описание |
|---|---|
WIFEXITED(stat_val) | Ненулевой, если дочерний процесс завершен нормально |
WEXITSTATUS(stat_val) | Если WIFEXITED |
WIFSIGNALED(stat_val) | Ненулевой, если дочерний процесс завершается неперехватываемым сигналом |
WTERMSIG(stat_val) | Если WIFSIGNALED |
WIFSTOPPED(stat_val) | Ненулевой, если дочерний процесс остановился |
WSTOPSIG(stat_val) | Если WIFSTOPPED |
Выполните упражнение 11.4.
waitВ этом упражнении вы слегка измените программу, чтобы можно было подождать и проверить код состояния дочернего процесса. Назовите новую программу wait.c.
#include <sys/types.h><i>#include <sys/wait.h></i>#include <unistd.h>#include <stdio.h>#include <stdlib.h>int main() { pid_t pid; char* message; int n;<i> int exit_code;</i> printf("fork program startingn"); pid = fork(); switch(pid) { case -1: perror("fork failed"); exit(1); case 0: message = "This is the child"; n = 5;<i> exit_code = 37;</i> break; default: message = "This is the parent"; n = 3;<i> exit_code = 0;</i> break; } for (; n > 0; n--) { puts(message); sleep(1); }Следующий фрагмент программы ждет окончания дочернего процесса:
if (pid != 0) { int stat_val; pid_t child_pid; child_pid = wait(&stat_val); printf("Child has finished: PID = %dn", child_pid); if (WIFEXITED(stat_val)) printf("Child exited with code %dn", WEXITSTATUS(stat_val)); else printf("Child terminated abnormallyn"); } exit(exit_code);}Когда вы выполните эту программу, то увидите, что родительский процесс ждет дочерний:
$ <b>./wait</b>fork program startingThis is the childThis is the parentThis is the parentThis is the childThis is the parentThis is the childThis is the childThis is the childChild has finished: PID = 1582Child exited with code 37$Как это работает
Родительский процесс, получивший ненулевое значение, возвращенное из вызова
forkwaitexitwaitПроцессы-зомби
Применение вызова
forkwaitwait
