1 回答
TA贡献1780条经验 获得超5个赞
在子级中,您的程序只需将1加5,产生6,打印6,然后返回6作为退出状态。
在父级中,wait(&val)成功返回后,将val包含一个魔术cookie。孩子的退出状态被编码在这个cookie,但必须使用宏来提取WIFEXITED,WIFSIGNALED,WEXITSTATUS,WTERMSIG,等递增的cookie数字没有意义。如果知道W-macros在特定操作系统上的工作方式,则以数字方式将其打印出来会产生一些可以理解的想法,但是除了调试某些东西之外,您不应该这样做。
父级在程序中打印的数字1537易于理解,以十六进制表示:0x0601。这意味着在增加原始Cookie值之前,其值为0x0600。在Linux上,WIFEXITED(0x0600)是和WEXITSTATUS(0x0600) == 6。在任何其他操作系统上,它可能意味着相同,也可能不相同。
假设您打算生产一台Rube Goldberg机器,用于印刷6和7,则更好的方法是这样的:
#include <assert.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
int main(void)
{
int val, status;
pid_t pid = fork();
if (pid == -1) {
perror("fork");
return 1;
}
if (pid == 0) {
val = 5;
val++;
printf("%d\n", val);
return val;
}
/* we are the parent if we get here */
if (wait(&status) != pid) {
perror("wait");
return 1;
}
if (!WIFEXITED(status)) {
assert(WIFSIGNALED(status));
printf("child process killed by signal %d\n", WTERMSIG(status));
return 1;
}
val = WEXITSTATUS(status);
val++;
printf("%d\n", val);
return 0;
}
- 1 回答
- 0 关注
- 402 浏览
添加回答
举报