我一直在尝试弄清楚如何在Linux中使用fork-exec机制。一切都在按计划进行,直到一些网页开始让我感到困惑。
有人说,子进程应该严格使用_exit(),而不是简单的exit()或来自main()的正常返回。
据我所知,Linux shell fork-execs每一个外部命令;假设我上面所说的是真的,那么结论是这些外部命令或Linux shell内部发生的任何其他执行都不能正常返回!
维基百科&其他一些网页声称,我们使用_exit()只是为了防止一个子进程导致父母的临时文件被删除,同时可能会发生stdio缓冲区的双重刷新。虽然我理解前者,但我不知道双重刷新缓冲区会对Linux系统造成怎样的危害。
我花了一整天的时间在这上面...感谢您的任何澄清。
发布于 2011-03-25 01:29:41
您应该在exec失败时使用_exit (或其同义词_Exit)中止该子程序,因为在这种情况下,子进程可能会通过调用其atexit处理程序、调用其信号处理程序和/或刷新缓冲区来干扰父进程的外部数据(文件)。
出于同样的原因,您还应该在任何不执行exec的子进程中使用_exit,但这种情况很少见。
在所有其他情况下,只需使用exit即可。正如您已经注意到的,Unix/Linux中的每个进程(除了init之外)都是另一个进程的子进程,因此在每个子进程中使用_exit将意味着exit在init之外是无用的。
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 ...
}发布于 2014-02-14 22:07:13
exit()刷新io缓冲区,并执行其他一些操作,如运行atexit()注册的函数。exit()调用_end( )
_exit()只是在不这样做的情况下结束这个过程。例如,在创建守护进程时,您可以从父进程调用_exit()。
有没有注意到main()是一个函数?有没有想过最初是什么叫它的?当一个c程序运行你正在运行的外壳时,它提供了'exec‘系统调用的可执行路径,并且控制被传递给内核,内核反过来调用每个可执行_start()的启动函数,调用你的main(),当main()返回它,然后调用_end()时,C的一些实现使用稍微不同的名称来表示_end()和_start() ...
exit()和_exit()调用_end()
通常-对于每个main(),应该有一个&只有一个exit()调用。(或在main()的末尾返回)
发布于 2017-03-26 03:44:04
exit()位于_exit()的顶部,使用传统的C库。
这里有一些区别:
当exit()在退出前刷新stdio缓冲区时,
exit( status )只是将退出状态传递给_exit(status)。建议无论何时执行fork(),其中一个在子进程和父进程之间,一个使用_exit(),另一个使用exit()。
https://stackoverflow.com/questions/5422831
复制相似问题