如何退出一个subprocess – _exit()与退出
考虑这个代码片段:
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返回,我将如何退出subprocess? 我应该使用exit()还是_exit()?
你一定要使用_Exit()
。 exit()
调用你用atexit()
添加的函数,删除用tmpfile()
创build的文件。 由于父进程确实是在存在的时候需要完成这些工作的,所以你应该调用_Exit()
,这些都不会做。
注意_Exit()
与大写_exit(2)
可能不是你想直接调用的。 exit(3)
和_Exit(3)
会为你打电话。 如果你没有_Exit(3)
,那么是的, _exit()
是你想要的。
fork()的孩子应该总是调用_exit()。
调用exit()是一个很好的方法,可以使挂起的stdio缓冲区刷新两次。
如果成功,execvp会退出子项,所以你不必退出。
execve失败,我只需使用exit(EXIT_FAILURE);
在孩子。
编辑:我发现后,一些研究: http : //www.unixguide.net/unix/programming/1.1.3.shtml
所以看起来在使用C ++的时候,最好在fork子类中使用_exit()
:p感谢你的问题,我学到了一些东西:D
这取决于你想要的行为: man -s 3 exit
和man _exit
了解你的系统的更多细节。 一般来说,我相信_exit不会运行用atexit()注册的函数,而exit(这些函数最好不要调用exit – 否则你会得到recursion)。
一般来说,我宁愿退出_exit,除了在用atexit注册的函数,在那些我会叫_exit,如果需要的话。
exit()
是ANSI-C函数,因此它是独立于操作系统的。 它closures了所有的ANSI-C标准function。 _exit()
被exit()
调用来closures操作系统相关的function,因为exit()
不知道它们( exit
操作系统是独立的)