如何退出子进程 - _exit()与exit

时间:2010-02-24 21:22:02

标签: c process fork

请考虑以下代码段:

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()吗?

5 个答案:

答案 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)

如果成功,execvp将退出子进程,因此您不必退出。

在execve失败时,我只是在孩子身上使用exit(EXIT_FAILURE);

编辑:我在经过一些研究后发现:http://www.unixguide.net/unix/programming/1.1.3.shtml

所以看起来最好在fork子句中使用_exit(),尤其是在使用C ++时:p 谢谢你的问题,我学到了一些东西:D

答案 3 :(得分:1)

这取决于您想要的行为:man -s 3 exitman _exit,了解有关系统的更多详细信息。一般来说,我认为_exit不会运行使用atexit()注册的函数,而exit会执行(这些函数最好不要调用exit - 否则会得到递归)。

一般情况下,我宁愿退出_exit,除了在atexit注册的函数中,如果需要,我会调用_exit。

答案 4 :(得分:0)

exit()是ANSI-C函数,因此它与操作系统无关。它关闭所有ANSI-C标准功能。 _exit()调用exit()来关闭与操作系统相关的功能,因为exit()对它们一无所知。(exit与操作系统无关)