“&”如何用于打印进程退出代码的整数值?
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。
这是最终结果前八位的值。
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
应该会为您提供所有可用宏的完整说明(如果您需要的话)。
我在看一个教学示例,我看到我的教授使用这种语法来打印 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。
这是最终结果前八位的值。
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
应该会为您提供所有可用宏的完整说明(如果您需要的话)。