一尘不染

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

linux

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

据说应该严格使用子进程,_exit()而不是exit()从或简单或正常返回main()

据我所知,Linux shell fork-execs执行每个外部命令。假设我上面所说的是正确的,那么结论是,这些外部命令或Linux
shell内部发生的任何其他执行均不能正常返回!

维基百科和其他一些网页声称,我们_exit()只能用来防止子进程导致删除父级的临时文件,同时可能发生两次stdio缓冲区的刷新。尽管我了解前者,但是我不知道缓冲区的两次刷新会对Linux系统有害。

我整天都在此上…感谢您的澄清。


阅读 423

收藏
2020-06-02

共1个答案

一尘不染

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

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

在其他所有情况下,只需使用即可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 ...
}
2020-06-02