我在尝试使用fork()和exit()函数进行课程作业时遇到了问题。问题是我的子进程在正确完成时会以错误结束。这是我的代码:
{{1}}
我总是得到一个 Child错误警告。有什么建议吗?
答案 0 :(得分:1)
您的诊断"儿童因错误而终止"是产生它的条件的错误表征。如果 it 有错误,wait()
函数返回-1;如果调用进程没有要等待的子节点或者函数被信号中断,就会发生这种情况。
在你的情况下,原因是前者。成功时,fork()
函数在子进程中返回0,并在父进程中返回新子进程ID(大于0的数字)。除此之外,这是父母和孩子如何区分哪个是哪个。您在孩子中调用wait()
,该孩子没有自己的子进程。
请注意,孩子调用_exit()
而非exit()
可能会出现问题,因为前者会突然停止孩子(不会刷新打开的文件等),也会导致要发信号的父母(SIGCHILD
)。这有时候是你想要的,但我不明白为什么你会在这种情况下想要它。
另请注意,wait()
提供的状态会对收集过程的几个单独详细信息进行编码,包括但不限于其退出代码。除了通过为此目的提供的各种宏提取感兴趣的部分之外,对整个状态进行任何操作通常没有用。例如,要获取孩子的退出代码,您应该将状态传递给WEXITSTATUS()
宏。在实际代码中,测试过程是否正常退出可能也是明智的,而不是因为信号而终止。 WEXITED()
宏可以从状态中提取该信息。还有其他信息编码,以及其他用于提取它的宏。
因此,你可能会做得更好:
int pid = fork();
if (pid == 0)
{
/* child */
puts("child: End child.\n");
exit(0);
}
else if (pid > 0)
{
/* parent */
int status = 0;
if (wait(&status) == -1)
{
puts("parent: failed to wait.\n");
}
else
{
printf("parent: child's exit code: %d\n", WEXITSTATUS(status));
}
puts("parent: End parent.\n");
}
else
{
/* parent; error */
puts("failed to fork.\n");
}
答案 1 :(得分:0)
ret
应为0。在父进程中,ret
应包含子级PID
。
int ret = fork();
if (ret < 0) { perror("fork"); exit(1); } /* handle fork error */
if (ret == 0)
{
puts("child: End child.");
_exit(0);
}
else
{
/* <wait> code goes here */
}