gpt4 book ai didi

c - 在传统的 Linux fork-exec 中使用 _exit() 和 exit() 有什么区别?

转载 作者:IT老高 更新时间:2023-10-28 12:35:50 26 4
gpt4 key购买 nike

我一直试图弄清楚 fork-exec 机制是如何在 Linux 中使用的。一切都按计划进行,直到一些网页开始让我感到困惑。

据说子进程要严格使用_exit()而不是简单的 exit()或来自 main() 的正常返回.

据我所知,Linux shell fork-exec 会执行每一个外部命令;假设我上面说的是真的,那么结论是这些外部命令和Linux shell内部发生的任何其他执行都不能正常返回!

维基百科和其他一些网页声称我们必须使用 _exit()只是为了防止子进程导致删除父级的临时文件,而可能会发生 stdio 缓冲区的双重刷新。虽然我理解前者,但我不知道缓冲区的双重刷新如何对 Linux 系统有害。

我已经花了一整天的时间...感谢您的澄清。

最佳答案

您应该使用 _exit (或其同义词_Exit)在exec失败时中止子程序,因为在这种情况下,子进程可能会干扰父进程的外部数据(文件)通过调用其 atexit 处理程序、调用其信号处理程序和/或刷新缓冲区。

出于同样的原因,您也应该在任何不执行 exec 的子进程中使用 _exit,但这种情况很少见。

在所有其他情况下,只需使用 exit。正如您自己部分指出的那样,Unix/Linux 中的 每个 进程(除了一个,init)是另一个进程的子进程,因此在每个子进程都意味着 exitinit 之外是无用的。

switch (fork()) {
case 0:
// we're the child
execlp("some", "program", NULL);
_exit(1); // <-- HERE
case -1:
// error, no fork done ...
default:
// we're the parent ...
}

关于c - 在传统的 Linux fork-exec 中使用 _exit() 和 exit() 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5422831/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com