#linux #unix #endianness #glibc #systems-programming
#linux #unix #порядковый номер #glibc #системы-программирование
Вопрос:
в документации glibc о статусе завершения процесса указано, что макрос WEXITSTATUS возвращает младший порядок 8 байт статуса завершения.
Макрос: int WEXITSTATUS (состояние ввода)
Если значение статуса 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) amp; 0xff00) >> 8)
Если только все мои концепции порядкового номера не перепутались, как это младшие 8 бит? Или libc предполагает, что данные хранятся в формате малого порядка?
Ответ №1:
Это не проблема с порядковым номером. Порядковый номер относится к тому, как данные хранятся в памяти; на машине с большим или меньшим порядковым номером (((status) amp; 0xff00) >> 8)
извлекаются биты с 15 по 8, то есть с 8-го по 15-й младшие биты status
аргумента макроса.
Документация и комментарии сбивают с толку, потому что статус относится к двум разным вещам.
Завершающийся процесс возвращает код состояния. Это состояние выхода имеет тип int
в исходном коде (либо как возвращаемое значение из main
, либо как аргумент exit
), однако значение должно быть в диапазоне от 0 до 255.
Системные вызовы wait
и waitpid
также обеспечивают status
обратную связь с вызывающей стороной. Этот статус отличается; 8 бит младшего порядка исходного статуса завершения теперь находятся в битах с 15 по 8. Я предполагаю, что в документации говорится, что WEXITSTATUS возвращает «8 бит младшего порядка», потому что это была упаковка статуса выхода с точки зрения завершающегося процесса.
Комментарии:
1. В документации указано «8 бит младшего порядка», потому что, хотя дочерний процесс может иметь любое
int
возвращаемое значение, в среде Posix родительскому процессу возвращаются только 8 бит этого статуса с наименьшим значением. pubs.opengroup.org/onlinepubs/009695399/functions/_exit.html