私は出口で値を返さなければならない大学の演習を行っていましたが、その値は実際には何かのカウントでした。これは 255 を超える可能性があります (exit() では処理できません) が、教師は、カウントがその値を超えることのないテスト データを使用することを提案しました。
このすべての後、このカウント値、終了ステータスを処理する必要がありました。この値は、waitpid() を使用してメイン プロセスで取得しました。驚いたことに、子プロセスが 1 を返した場合、メイン プロセスの「実際の」値は 256、2 は 512 などでした...
この値を出力する必要があったので、単純に 256 で割りました。ただし、WEXITSTATUS() マクロを使用すると、この値も思い通りに取得できます...
Cソースコードを調べたところ、次のことがわかりました。
#define __WEXITSTATUS(status) (((status) & 0xff00) >> 8)
ここで何が起こっているか理解しています。たとえば、2 進数の 512 は 10 0000 0000 です。8 を右にシフトすると 00 0000 0010 になり、10 進数では 2 になります。このマクロで私が理解できないのは、& 演算子と、0xff00 が乱数のように見えるという事実です (おそらくそうではありませんが、どこから来たのでしょうか?)。これは正確には何をしますか?マクロに「& 0xff00」があるのはなぜですか? それがなければうまくいきませんか?
そして、このトピックの真の疑問は、コードでこのマクロを 256 で割ることと同じことを呼び出すことでしょうか?