message = "This is the parent";
n = 3;
break;
}
for (; n > 0; n--) {
puts(message);
sleep(1);
}
exit(0);
}
Эта программа выполняет два процесса. Дочерний процесс создается и выводит пять раз сообщение. Исходный процесс (родитель) выводит сообщение только три раза. Родительский процесс завершается до того, как дочерний процесс выведет все свои сообщения, поэтому в вывод попадает очередное приглашение командной оболочки.
$ ./fork1
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
Как это работает
Когда вызывается fork
fork значением и используется для задания количества сообщений, выводимых с интервалом в одну секунду.Ожидание процесса
Когда вы запускаете дочерний процесс с помощью вызова fork
wait заставить родительский процесс дождаться завершения дочернего процесса перед своим продолжением.#include
#include
pid_t wait(int *stat_loc);
Системный вызов wait
main или переданное функции exit. Если stat_loc не равен пустому указателю, информация о состоянии будет записана в то место, на которое указывает этот параметр.Интерпретировать информацию о состоянии процесса можно с помощью макросов, описанных в файле sys/wait.h и приведенных в табл. 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
#include
#include
#include
int main() {
pid_t pid;
char* message;
int n;
printf("fork program starting\n");
pid = fork();
switch(pid) {
case -1:
perror("fork failed");
exit(1);
case 0:
message = "This is the child";
n = 5;
break;
default:
message = "This is the parent";
n = 3;
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 = %d\n", child_pid);
if (WIFEXITED(stat_val))
printf("Child exited with code %d\n", WEXITSTATUS(stat_val));
else printf("Child terminated abnormally\n");
}
exit(exit_code);
}