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 и друзей.

Другие вопросы по тегам