Проверка статуса после ожидания()
-
22-09-2019 - |
Вопрос
После создания дочернего процесса и немедленного выхода из него (_exit()) я хочу выполнить ожидание и проверить статус.Теперь мне интересно, нужно ли в ветке 'else' конструкции if / else также проверять наличие WIFSIGNALED.Насколько я понимаю, если я выполняю ожидание, а) могла произойти ошибка (-1), дочерний процесс мог нормально завершиться (exit() или _exit()), или он мог быть завершен сигналом, так что проверка могла быть опущена, верно?
//remainder omitted
int status;
pid_t t_pid = wait(&status);
if (t_pid == -1) {
perror("wait");
exit(EXIT_FAILURE);
}
if (WIFEXITED(status)) {
printf("child terminated normally, status = %d\n",
WEXITSTATUS(status)
);
} else { // <-- do it have to check for WIFSIGNALED() here?
printf("child was terminated by a signal, signum = %d\n",
WTERMSIG(status)
);
}
Решение
Я не знаю.
Но вы могли бы сделать так, чтобы ваш ребенок умер "ненормально".убить (getpid()) в дочернем элементе?
Судя по звучанию слов в документах, я бы сказал, что вы делаете это правильно.
Другие советы
Да, вы правы - если wait
преуспел тогда либо WIFEXITED()
или WIFSIGNALED()
будет правдой.
ДА. POSIX.1 состояния:
Если информация, на которую указывает stat_loc, была сохранена вызовом waitpid(), который не указывал Флаги WUNTRACED или WCONTINUED, или с помощью вызова функции wait(), точно один из макросов WIFEXITED(*stat_loc) и WIFSIGNALED(*stat_loc) должен вычисляться до ненулевого значения.
Используя идентификатор ожидания() с помощью WUNTRACED или WCONTINUED можно получить статус, в котором вместо WIFSTOPPED(*stat_loc) или WIFCONTINUED(*stat_loc) значение true.