我正在试图找出以下代码的作用:
int main()
{
int value = 3;
if (fork() != 0)
{
wait(&value);
}
else
{
exit(value);
}
value = WEXITSTATUS(value);
value++;
printf("%d", value);
return value;
}
我知道它创造了一个儿子进程,它还告诉父进程等待儿子进程。并命令儿子进程退出(3)。 当我调试我的答案时,我看到命令:第6行的wait(& value)返回3 * 256,但我读到它假设从子进程返回退出状态值的低8位,意思是它不能超过255.它不会改变我的输出4,即退出状态加1,但我仍然感兴趣的地方,为什么我得到256。 有人可以解释我错过了什么,或者完全没有理解? 非常感谢!
答案 0 :(得分:0)
您混淆的原因是您正在处理设计不佳的操作系统服务。
您需要查看wait()函数的文档:
http://pubs.opengroup.org/onlinepubs/009695399/functions/wait.html
发生的事情是,这个按事故设计的功能将很多东西变成了一个返回参数。有许多宏会通过扩展位字段将此返回值解压缩到其单独的组件中。
你得到3 * 256而不是3的原因是该函数必须为进程退出状态腾出空间,这显然是0.你得到二进制值:
0000 0000 0000 0000 0000 0011 0000 0000
|UNUSED |
|Process
Return
Value | | Other Stuff |