Какое-либо преимущество в использовании макроса WEXITSTATUS в C по подразделению 256 на выходе () состояние?

В вашем коде есть что-то странное, вы, кажется, хотите получить что-то с вашим API, но вы ничего не делаете с результатом aka data.

12
задан Ricardo Amaral 30 April 2009 в 19:04
поделиться

3 ответа

И настоящий вопрос в этой теме, это то же самое, чтобы назвать этот макрос в моем коде как деление на 256?

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

Состояние, сохраненное в waitpid () , кодирует как причину завершения дочернего процесса, так и код выхода. Причина сохраняется в младшем значащем байте (полученном из status & 0xff ), а код выхода сохраняется в следующем байте (маскируется status & 0xff00 и извлекается с помощью WEXITSTATUS () ). Когда процесс завершается нормально, причина равна 0, и поэтому WEXITSTATUS просто эквивалентно сдвигу на 8 (или делению на 256). Однако, если процесс прерывается сигналом (таким как SIGSEGV), код выхода отсутствует,

18
ответ дан 2 December 2019 в 05:55
поделиться

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.

3
ответ дан 2 December 2019 в 05:55
поделиться

Здесь 0xff00 - двоичная маска ( текст ссылки ). И добавление в него значения устанавливает все биты в ноль, кроме второго байта (считая справа).

Вы должны использовать WEXITSTATUS в процессе, который, как известно, завершился нормально. Эта информация дается макросом WIFEXITED .

И реальный вопрос в этой теме - это то же самое, что называть этот макрос в моем коде делением на 256?

Макрос делает код более читабельный, и он гарантированно будет работать с любой Posix-совместимой реализацией. Насколько я знаю, Posix не определяет формат статуса, поэтому вы не можете ожидать, что ваш код будет работать везде.

2
ответ дан 2 December 2019 в 05:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: