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

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

Однако, если я использую exit(1), я получаю 256 в качестве вывода из wait(). Использование exit(-1) дает 65280.

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

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

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


person Community    schedule 07.09.2010    source источник
comment
Я только что прочитал, что exit() рекомендуется вместо _exit() для полного завершения, прямо здесь, на stackoverflow.com.   -  person    schedule 07.09.2010
comment
Использование exit() против _exit() не имеет значения - статус выхода обрабатывается одинаково в любом случае. Используйте exit(), чтобы убедиться, что ожидающий вывод сбрасывается из стандартных каналов ввода-вывода и подобных проблем очистки - на самом деле, используйте exit() почти все время. Основания для использования _exit() есть, но они редки.   -  person Jonathan Leffler    schedule 07.09.2010
comment
Да, exit определенно правильный выбор. Ваша проблема не exit, а waitpid, как предполагает ответ Дэймона.   -  person Jens Gustedt    schedule 07.09.2010
comment
См. также Коды выхода больше 255 — возможно?   -  person Jonathan Leffler    schedule 01.06.2017


Ответы (5)


Вы пробовали "man waitpid"?

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

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

if(!(pid=fork()))
{
    exit(1);
}
waitpid(pid,&status,0);
if (WIFEXITED(status)) {
    printf("%d", WEXITSTATUS(status));
}
person Darron    schedule 07.09.2010
comment
можете ли вы дать мне какие-либо сведения о выводе 255 для выхода (-1), используя ваш код? - person ; 07.09.2010
comment
В нотации с дополнением до 2 значение -1 соответствует всем установленным битам. Если вы замаскируете это значение до 8 бит и обработаете его как беззнаковое, оно будет выглядеть как 255. Неспособность отличить выход (-1) от выхода (255) является досадным ограничением способа возврата значений выхода из семейства функций ожидания. - person Darron; 07.09.2010

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

Старшие 8 бит — это код выхода из exit().

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

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

person Jonathan Leffler    schedule 07.09.2010
comment
Нет ли способа получить больше 255 из статуса выхода? - person Debashish; 01.06.2017
comment
В POSIX-системах нет. В Windows да. - person Jonathan Leffler; 01.06.2017
comment
См. также ExitCodes больше 255 — возможно? - person Jonathan Leffler; 08.04.2021

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

person Matthew Flaschen    schedule 07.09.2010

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

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

e.g.:

int cstatus;
wait(&cstatus);
printf("Child exit status : %d\n", WEXITSTATUS(cstatus));
person user4762317    schedule 10.04.2015
comment
Не отвечает на вопрос, - person user207421; 31.01.2016

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

person user207421    schedule 31.01.2016