C 如何退出子进程-_exit()与exit
考虑以下代码片段:C 如何退出子进程-_exit()与exit,c,process,fork,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(
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()?如果成功,execvp将退出子项,因此您不必退出 在execve失败时,我只需使用
exit(exit\u failure)代码>在子对象中
编辑:经过一些研究,我发现:
<> p>这样,在C++中,当你在C++中时,最好使用<代码>
谢谢你的提问,我学到了一些东西:D这取决于你想要的行为:man-s3退出
和man\u退出
,了解有关系统的更多详细信息。一般来说,我相信_exit不会运行使用atexit()注册的函数,而exit会运行(这些函数最好不要调用exit,否则会得到递归)
一般来说,我更喜欢退出而不是退出,除了在atexit注册的函数中,如果需要,我会调用退出。您肯定应该使用\u exit()
exit()
调用使用atexit()
添加的函数,并删除使用tmpfile()
创建的文件。由于父进程实际上是希望在它存在时完成这些事情的进程,因此您应该调用\u Exit()
,它不执行这些操作
注意\u Exit()
带有大写字母E。\u Exit(2)
可能不是您想要直接调用的<代码>退出(3)
和\u退出(3)
将为您调用此命令。如果您没有\u Exit(3)
,那么是的,\u Exit()
就是您想要的。fork()的子级应该始终调用
调用exit()是导致挂起的stdio缓冲区刷新两次的好方法。exit()
是ANSI-C函数,因此,它与操作系统无关。它关闭所有ANSI-C标准函数。
\u exit()
被exit()
调用以关闭依赖于操作系统的功能,因为exit()
不知道这些功能。(exit
与操作系统无关)+1您希望失败的子进程安静地退出,就像它从未被创建过一样。由于旧的C标准允许链接器解析不区分大小写,因此退出()不能是标准库函数,因为它会与旧的退出()冲突。对不起,恰恰相反_出口(3)是一个标准C库(ISO C99)_退出(2)是POSIX.1系统调用,而不是C标准。是否在调用\u exit
后关闭文件等打开的资源由实现定义。您可能不希望出现这种行为(关于未冲洗的流)。我看到的所有手册页都说,\u exit
不会刷新流,因此在分叉时,如果文件具有未刷新的内容,则更安全。\u exit
不是标准的C,这一点是没有意义的,因为fork
也是Unix特有的。C标准委员会可能有特殊理由引入\u Exit
,但Unix程序员根本没有理由将\u Exit
更改为\u Exit
@VariableLengthCoderexec不会返回,除非在错误中调用_exit。“_exit()是一个Linux内核函数”是不正确的,请看你是对的,但我其余的评论是正确的。参见:David Curry编写的Unix系统编程,第291页。