В вашем коде есть что-то странное, вы, кажется, хотите получить что-то с вашим API, но вы ничего не делаете с результатом aka data
.
И настоящий вопрос в этой теме, это то же самое, чтобы назвать этот макрос в моем коде как деление на 256?
Это, вероятно, всегда будет работать в тех случаях, когда дочерний процесс завершается нормально (то есть, вызывая exit (), а не из-за ошибки сегментации, ошибки утверждения и т. д.).
Состояние, сохраненное в waitpid ()
, кодирует как причину завершения дочернего процесса, так и код выхода. Причина сохраняется в младшем значащем байте (полученном из status & 0xff
), а код выхода сохраняется в следующем байте (маскируется status & 0xff00
и извлекается с помощью WEXITSTATUS ()
). Когда процесс завершается нормально, причина равна 0, и поэтому WEXITSTATUS
просто эквивалентно сдвигу на 8 (или делению на 256). Однако, если процесс прерывается сигналом (таким как SIGSEGV), код выхода отсутствует,
If the status variable is a signed 16-bit integer (a 'short') on a machine where 'int' is a 32-bit quantity, and if the exit status is in the range 128..255, then WEXITSTATUS() still gives you a correct value where dividing by 256 or simply shifting right will give you an incorrect value.
This is because the short will be sign extended to 32-bits, and the masking undoes the the sign extension, leaving the correct (positive) value in the result.
If the machine used 16-bit integers, then the code in WEXITSTATUS() would probably do shift then mask to ensure similar behaviour:
#define WEXITSTATUS(status) (((status)>>8) & 0xFF)
It is because the implementation takes care of such details for you that you should use the WEXITSTATUS() macro.
Здесь 0xff00 - двоичная маска ( текст ссылки ). И добавление в него значения устанавливает все биты в ноль, кроме второго байта (считая справа).
Вы должны использовать WEXITSTATUS
в процессе, который, как известно, завершился нормально. Эта информация дается макросом WIFEXITED
.
И реальный вопрос в этой теме - это то же самое, что называть этот макрос в моем коде делением на 256?
Макрос делает код более читабельный, и он гарантированно будет работать с любой Posix-совместимой реализацией. Насколько я знаю, Posix не определяет формат статуса, поэтому вы не можете ожидать, что ваш код будет работать везде.