如何退出一个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 exitman _exit了解你的系统的更多细节。 一般来说,我相信_exit不会运行用atexit()注册的函数,而exit(这些函数最好不要调用exit – 否则你会得到recursion)。

一般来说,我宁愿退出_exit,除了在用atexit注册的函数,在那些我会叫_exit,如果需要的话。

exit()是ANSI-C函数,因此它是独立于操作系统的。 它closures了所有的ANSI-C标准function。 _exit()exit()调用来closures操作系统相关的function,因为exit()不知道它们( exit操作系统是独立的)