Я делал упражнение для университета, где мне приходилось возвращать значение с выходом, это значение было подсчетом чего-то. Это может быть больше 255 (которое exit () не может обработать), но учитель предложил использовать тестовые данные, когда количество никогда не может превышать это значение.
После всего этого мне нужно было обработать это значение счетчика, состояние выхода, я получил это значение в основном процессе с помощью waitpid (). К моему удивлению, если дочерний процесс возвратил 1, «реальное» значение в основном процессе было 256, 2 было 512 и так далее ...
Мне нужно было напечатать это значение, поэтому я просто разделил его на 256, и это было сделано. Однако, если я использую макрос WEXITSTATUS (), я также получу это значение так, как я хочу ...
Я посмотрел на исходный код C, и вот что я узнал:
#define __WEXITSTATUS(status) (((status) & 0xff00) >> 8)
Я понимаю, что здесь происходит, например, 512 в двоичном виде - это 10 0000 0000, сдвиг на 8 o вправо даст 00 0000 0010, то есть 2 в десятичном виде. Что я не понимаю в этом макросе, так это оператор & и тот факт, что 0xff00 кажется случайным числом (хотя, вероятно, это не так, откуда оно?). Что именно это делает, почему в макросе есть «& 0xff00»? Разве это не сработает?
И настоящий вопрос в этой теме, это то же самое, что называть этот макрос в моем коде делением на 256?