Проверка состояния после ожидания () - PullRequest
0 голосов
/ 29 марта 2010

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

Ответы [ 3 ]

1 голос
/ 29 марта 2010

Да, вы правы - если wait успешно, то либо WIFEXITED(), либо WIFSIGNALED() будет истинным.

1 голос
/ 29 марта 2010

Да. POSIX.1 состояния:

Если информация указана stat_loc был сохранен при вызове waitpid (), который не указал Флаги WUNTRACED или WCONTINUED, или вызов функции wait (), точно один из макросов WIFEXITED (* stat_loc) и WIFSIGNALED (* stat_loc) должны оценить ненулевое значение.

Используя waitpid () с WUNTRACED или WCONTINUED, можно получить состояние, в котором вместо WIFSTOPPED (* stat_loc) или WIFCONTINUED (* stat_loc) указано true.

1 голос
/ 29 марта 2010

Не знаю.

Но вы могли бы заставить своего ребенка умереть "ненормально".kill (getpid ()) в ребенке?

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

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

...