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

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

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

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

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

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

Ответы [ 5 ]

17 голосов
/ 07 сентября 2010

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

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

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

if(!(pid=fork()))
{
    exit(1);
}
waitpid(pid,&status,0);
if (WIFEXITED(status)) {
    printf("%d", WEXITSTATUS(status));
}
11 голосов
/ 07 сентября 2010

Код выхода - 16-битное значение.

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

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

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

4 голосов
/ 07 сентября 2010

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

2 голосов
/ 10 апреля 2015

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

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

, например:

int cstatus;
wait(&cstatus);
printf("Child exit status : %d\n", WEXITSTATUS(cstatus));
0 голосов
/ 31 января 2016

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

...