我一直在尝试弄清楚在Linux内部如何使用fork-exec机制。一切都按计划进行,直到一些网页开始使我感到困惑。
据说应该严格使用子进程,_exit()而不是exit()从或简单或正常返回main()。
_exit()
exit()
main()
据我所知,Linux shell fork-execs执行每个外部命令。假设我上面所说的是正确的,那么结论是,这些外部命令或Linux shell内部发生的任何其他执行均不能正常返回!
维基百科和其他一些网页声称,我们_exit()只能用来防止子进程导致删除父级的临时文件,同时可能发生两次stdio缓冲区的刷新。尽管我了解前者,但是我不知道缓冲区的两次刷新会对Linux系统有害。
我整天都在此上…感谢您的澄清。
当失败时,您应该使用_exit(或它的同义词_Exit)中止子程序exec,因为在这种情况下,子进程可能会通过调用其atexit处理程序,调用其信号处理程序和/或使其干扰父进程的外部数据(文件)。冲洗缓冲区。
_exit
_Exit
exec
atexit
出于同样的原因,您还应该_exit在任何不执行的子进程中使用exec,但是这种情况很少见。
在其他所有情况下,只需使用即可exit。正如您自己部分指出的那样,Unix / Linux中的 每个 进程(一个除外init)都是另一个进程的子进程,因此_exit在每个子进程中使用意味着exit在之外没有用init。
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 ... }