Вопрос

После создания дочернего процесса и немедленного выхода из него (_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()) в дочернем элементе?

http://publib.boulder.ibm.com/infocenter/tpfhelp/current/index.jsp?topic=/com.ibm.ztpf-ztpfdf.doc_put.cur/gtpc2/cpp_wifsignaled.html

Судя по звучанию слов в документах, я бы сказал, что вы делаете это правильно.

Другие советы

Да, вы правы - если 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top