“&”如何用于打印进程退出代码的整数值?

How is "&" used to print the integer value of a process exit code?

我在看一个教学示例,我看到我的教授使用这种语法来打印 child 进程的退出值:

wait(&value);
printf("last two bytes of value are %d - %d\n",(value>>8)&255,value&255); 

“value”变量被定义为一个int,wait()被parent用来等待通过“fork()”生成的child进程。 child 可以通过信号终止,也可以在固定时间后自行终止。 据我了解,由于变量“value”是一个 int,它有 4 个字节,但是“exit(int)”的退出代码只写在四个字节之一中。如果进程不是由 exit() 终止,而是从一个信号终止,那么在这四个字节中的另一个字节中,我会收到该信号的代码。 所以我想我有“(值>>8)”的事实是由于使用了字节,但我不明白的是为什么我使用带有“&255”的语法来打印这些值。

数字 255 在二进制中表示为 11111111,在十六进制中表示为 FF。按位与这个数字将只留下最低的 8 位。较高的位将被归零。

此操作可能是不必要的,因为 wait() 的手册告诉:

SYNOPSIS
       void exit(int status);
DESCRIPTION
       The exit() function causes normal process termination and
       the value of status & 0xFF is returned to the parent (see wait(2)).

好的,所以正在进行一些位操作:

假设您有 32 位整数:

0101 0101 1011 0101 1101 1010 1111 1101

1:(value>>8)&255这会执行两个操作:右移8次,然后“与”操作。轮班后:

0000 0000 0101 0101 1011 0101 1101 1010

“和”之后:

0000 0000 0000 0000 0000 0000 1101 1010。

这是最终结果前八位的值。

  1. value&255:这将再次执行“和”,并且您有:

0000 0000 0000 0000 0000 0000 1111 1101

这是结果的最后 8 位。

TL:DR

value&255 将 32 位值的前 24 位清零。

some_int & 255(以及更明显的 some_int & 0xFF)意味着“取最少的字节并将其他所有内容归零”。所以代码只是打印出进程状态码的字节1和字节0。

我不明白为什么你的教授甚至会为这件事烦恼。 如果您需要子进程的 return 代码,您应该使用标准 WEXITSTATUS() 宏和其他用于其他状态的标准宏。 如果您正在使用 Linux,那么 man 3 wait 应该会为您提供所有可用宏的完整说明(如果您需要的话)。