请考虑以下代码段:
pid_t cpid = fork();
if (cpid == -1) {
perror("fork");
exit(EXIT_FAILURE);
}
if (cpid == 0) { // in child
execvp(argv[1], argv + 1);
perror("execvp");
_exit(EXIT_FAILURE);
}
// in parent
如果execvp返回,我该如何退出子进程?我应该使用exit()或_exit()吗?
答案 0 :(得分:47)
你绝对应该使用_Exit()
。 exit()
调用您使用atexit()
添加的功能,并删除使用tmpfile()
创建的文件。由于父进程确实是在存在时希望完成这些操作的进程,因此您应该调用_Exit()
,而不执行这些操作。
注意_Exit()
有一个大写字母E. _exit(2)
可能不是您想直接调用的。 exit(3)
和_Exit(3)
会为您拨打此电话。如果您没有_Exit(3)
,那么是,_exit()
就是您想要的。
答案 1 :(得分:15)
fork()的子节点应该始终调用_exit()。
调用exit()是一种很好的方法,可以将挂起的stdio缓冲区刷新两次。
答案 2 :(得分:3)
在execve失败时,我只是在孩子身上使用exit(EXIT_FAILURE);
。
编辑:我在经过一些研究后发现:http://www.unixguide.net/unix/programming/1.1.3.shtml
所以看起来最好在fork子句中使用_exit()
,尤其是在使用C ++时:p
谢谢你的问题,我学到了一些东西:D
答案 3 :(得分:1)
这取决于您想要的行为:man -s 3 exit
和man _exit
,了解有关系统的更多详细信息。一般来说,我认为_exit不会运行使用atexit()注册的函数,而exit会执行(这些函数最好不要调用exit - 否则会得到递归)。
一般情况下,我宁愿退出_exit,除了在atexit注册的函数中,如果需要,我会调用_exit。
答案 4 :(得分:0)
exit()
是ANSI-C函数,因此它与操作系统无关。它关闭所有ANSI-C标准功能。
_exit()
调用exit()
来关闭与操作系统相关的功能,因为exit()
对它们一无所知。(exit
与操作系统无关)