glibc документация и порядковый номер - PullRequest
2 голосов
/ 10 мая 2011

В документации glibc о состоянии завершения процесса указано, что макрос WEXITSTATUS возвращает младшие 8 байтов состояния завершения.

Макрос: int WEXITSTATUS (int status)

Если WIFEXITED имеет значение true для состояния, этот макрос возвращает младшие 8 битов значения состояния выхода из дочернего процесса.

Однако /usr/include/sys/wait.h говорит:

# define WEXITSTATUS(status)    __WEXITSTATUS (__WAIT_INT (status))

А, /usr/include/bits/waitstatus.h упоминает:

/* If WIFEXITED(STATUS), the low-order 8 bits of the status.  */
#define __WEXITSTATUS(status)   (((status) & 0xff00) >> 8)

Если мои понятия о порядке байтов не перепутаны, то как это младший 8 бит? Или libc предполагает, что данные хранятся в порядке с прямым порядком байтов?

1 Ответ

4 голосов
/ 10 мая 2011

Это не проблема порядка байтов.Порядковый номер относится к тому, как данные хранятся в памяти;на машине с прямым или прямым порядком байтов (((status) & 0xff00) >> 8) извлекает биты с 15 по 8, т. е. с 8 по 15 младшие биты макро аргумента status.

Документация и комментарии сбивают с толку, посколькуотносится к двум разным вещам.

Выходящий процесс возвращает код состояния.Это состояние выхода имеет тип int в источнике (либо в качестве возвращаемого значения от main, либо в качестве аргумента для exit), однако значение должно быть в диапазоне от 0 до 255.

* 1012Системные вызовы * и waitpid также предоставляют абоненту status.Этот статус отличается;младшие 8 битов исходного состояния выхода теперь находятся в битах с 15 по 8. Я предполагаю, что в документации сказано, что WEXITSTATUS возвращает «младшие 8 битов», потому что это была упаковка состояния выхода с точки зрения процесса выхода..

...