当前位置: 首页 > 面试题库 >

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

唐炳
2023-03-14
问题内容

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

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

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

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

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


问题答案:

当失败时,您应该使用_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 ...
}


 类似资料:
  • 本文向大家介绍PHP中die()和exit()有什么区别?,包括了PHP中die()和exit()有什么区别?的使用技巧和注意事项,需要的朋友参考一下 die和exit之间没有区别,它们是相同的。 退出状态的PHP手册- 模具状态的PHP手册- 但是,差异很小,即解析器返回令牌所花费的时间。

  • 问题内容: 请帮助我根据功能上的差异来阐明这两个python语句的概念: 问题答案: 根据文档: 退出状态为n的进程,而无需调用清理处理程序,刷新stdio缓冲区等。 注意 退出的标准方法是。通常只应在。之后的子进程中使用。

  • 问题内容: 考虑: 我尝试通过以下方式调用此过程: 但这只会产生 但是,如果我将其更改为 一切正常。尽管文档指出这是正确的语法,但这仍然可行。 为什么什么时候不工作? 问题答案: 如您的文档所述,Yup ..是可从ODBC驱动程序使用的构造/语法。 还有的T-SQL文档中没有提及,只。 它不起作用,因为它不是T-SQL。

  • 问题内容: 我最近一直在学习系统编程课程,并且通过系统调用 exec() 和 execve()来学习 。到目前为止,我找不到这两者之间的任何区别,即使Wikipedia也没有给出明确的解释,所以 exec() 和 execve() 之间也存在区别。 有人可以提供有关exec系列系统调用的简短描述,例如 execl() , execv() , execle() , execvp() 。 问题答案:

  • 问题内容: 我一直在研究Python代码的动态评估,并遇到和函数以及该语句。 有人可以解释之间的区别和怎样的不同模式,适应吗? 问题答案: 简短答案,即TL; DR 基本上,用于EVAL审视你们单个动态生成的Python表达式,并exec用于EXEC动态生成的Python代码仅针对其副作用尤特。 并具有以下两个区别: eval仅接受一个表达式,exec可以使用具有Python语句的代码块:循环和函