【问题标题】:How is "&" used to print the integer value of a process exit code?“&”如何用于打印进程退出代码的整数值?
【发布时间】:2021-08-08 16:24:26
【问题描述】:

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

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

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

【问题讨论】:

标签: c linux printf fork wait


【解决方案1】:

数字 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)).

【讨论】:

  • 该操作是必要的,因为子进程可能不是由于正常的exit()而是由于信号而结束。我假设教授使用这些最少的字节来展示 wstatus 如何在宏中使用,例如 (WEXITSTATUS)[man7.org/linux/man-pages/man2/waitpid.2.html]
【解决方案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 位清零。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-16
      • 2014-08-23
      相关资源
      最近更新 更多