Почему wait () устанавливает статус 256 вместо статуса выхода -1 раздвоенного процесса?

Я пытаюсь вернуть целочисленное значение из дочернего процесса.

однако, если я использую выход(1) Я 256 как выход. выход(-1) дает 65280.

есть ли способ получить фактическое значение int, которое я отправляю из дочернего процесса?

if(!(pid=fork()))
{
    exit(1);
}
waitpid(pid,&status,0);
printf("%d",status);

Edit: используя exit (-1) (что я действительно хочу), я получаю 255 в качестве вывода для WEXITSTATUS (status). Это должно быть неподписанные?

5 ответов


вы пробовали "человек waitpid"?

значение, возвращаемое вызовом waitpid (), является кодировкой значения exit. Существует набор макросов, которые будут предоставлять исходное значение выхода. Или вы можете попробовать правильно сдвинуть значение на 8 бит, Если вас не волнует переносимость.

портативная версия вашего кода будет:

if(!(pid=fork()))
{
    exit(1);
}
waitpid(pid,&status,0);
if (WIFEXITED(status)) {
    printf("%d", WEXITSTATUS(status));
}

код выхода представляет собой 16-разрядное значение.

8 бит высокого порядка - это код выхода из exit().

младшие 8 бит равны нулю, если процесс вышел нормально, или кодируют номер сигнала, который убил процесс, и независимо от того, сбросил ли он ядро или нет (и если он был сигнализирован, биты высокого порядка равны нулю).

Проверьте <sys/wait.h> заголовок и документация waitpid() системный вызов, чтобы увидеть, как получить правильные значения WIFEXITED и WEXITSTATUS.


посмотреть документация. Первое использование WIFEXITED чтобы определить, завершается ли он нормально (возможно, с ненулевым статусом). Затем используйте WEXITSTATUS чтобы определить, что такое 8 бит низкого порядка фактического состояния.


использовать WEXITSTATUS() чтобы прочитать правильный статус выхода ребенка

передать статус, возвращенный waitpid() или wait()

например:

int cstatus;
wait(&cstatus);
printf("Child exit status : %d\n", WEXITSTATUS(cstatus));

Это не так. Он устанавливает значение 255. Доступно только 8 бит. См. документацию.