WEXITSTATUS(childStatus) возвращает 0, но waitpid возвращает -1
Насколько я знаю, если waitpid возвращает -1, то это условие ошибки. Как можно добиться успеха (EXIT_SUCCUSS) от дочернего процесса в WEXITSTATUS(childStatus)?
В чем отличие childStatus в waitpid и возвращаемом значении от WEXITSTATUS(childStatus)? Так ли это?
pid_t returnValue = waitpid(Checksum_pid, &childStatus, WNOHANG);
printf("return value = %d", returnValue);
printf("return value = %d", childStatus);
if (WIFEXITED(childStatus))
{
printf("Exit Code: _ WEXITSTATUS(childStatus)") ;
//Proceed with other calculation.
}
2 ответа
При использовании опции WNOHANG
Я ожидаю, что большую часть времени waitpid
вернусь -1
, с errno
установлен в ECHILD
,
В любом случае, всякий раз, когда waitpid
возвращается -1
, вы не должны смотреть на childStatus
что (насколько я знаю) может быть просто мусором. Вместо этого посмотрите на errno
и обращаться с этим соответствующим образом.
В противном случае ваш код, по-видимому, будет в порядке, и вы сможете извлечь 0
или же EXIT_SUCCESS
от childStatus
,
Справочная страница для waitpid
предлагает следующий пример кода:
if (WIFEXITED(status)) {
printf("exited, status=%d\n", WEXITSTATUS(status));
} else if (WIFSIGNALED(status)) {
printf("killed by signal %d\n", WTERMSIG(status));
} else if (WIFSTOPPED(status)) {
printf("stopped by signal %d\n", WSTOPSIG(status));
} else if (WIFCONTINUED(status)) {
printf("continued\n");
}
хотя было бы неплохо добавить финал else printf("oops?\n")
Заявление об этом.
WIFEXITED будет читать любое значение, хранящееся в childStatus, которое является целым числом, поэтому оно не должно приходить из waitpid() - попробуйте, например,
for(i = 0; i < 1234; i++)
printf("WIFEXITED(%d) %s\n", i, WIFEXITED(i) ? "yes" : "no");
Разница между childSTatus и WIFEXITED(childStatus) немного хитрая... В основном, состояние выхода было неправильно использовано, чтобы сообщить о состоянии выхода или сигнале, который убил процесс: вам нужно что-то вроде
struct exitstatus {
int status;
int signalnumber;
enum { exited, signaled };
};
но эта информация каким-то образом была сжата в одно целое число (я не уверен, что точные детали определены где-либо): например, на моем компьютере младшие 8 бит используются для номера сигнала (если есть) и битов 8-15 используются для кода выхода. Важным моментом в любом месте является то, что вам не нужно знать, как это происходит, только как получить желаемые результаты через WIFEXITED и друзей.