Читать книгу 📗 "Основы программирования в Linux - Мэтью Нейл"
<b>#include <sys/types.h></b>
<b>#include <sys/wait.h></b>
<b>pid_t wait(int *stat_loc);</b>
Системный вызов
wait
main
exit
stat_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.
Упражнение 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 starting
This is the child
This is the parent
This is the parent
This is the child
This is the parent
This is the child
This is the child
This is the child
Child has finished: PID = 1582
Child exited with code 37
$
Как это работает
Родительский процесс, получивший ненулевое значение, возвращенное из вызова
fork
wait
exit
wait
Процессы-зомби
Применение вызова
fork
wait
wait