Основы программирования в Linux
Основы программирования в Linux читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
<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.
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