Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何退出子进程-_exit()与exit_C_Process_Fork - Fatal编程技术网

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页。