是什么在传统的Linux叉EXEC使用_exit()和exit()有什么区别?

问题描述 投票:45回答:4

我一直在试图找出叉EXEC机制是如何内部的Linux使用。一切都会在按计划直到某些网页开始迷惑我。

有人说,一个孩子的过程要严格,而不是用一个简单的_exit()exit()一个正常返回的main()

据我所知,Linux的shell叉高管的外部命令中的每一个;假设我上面说的是真的,得出的结论是,没有这些外部命令或任何其他执行Linux外壳内部发生的可以做正常的回报!

维基百科和其他一些网页要求我们必须使用_exit()只是为了防止父母的临时文件子进程造成的缺失,而标准输入输出缓冲器的可能二次冲洗可能发生。虽然我理解前者,我没有线索缓存的双冲洗怎么可能是有害的Linux系统。

我花了我整整一天这个...感谢任何澄清。

c linux return fork exit
4个回答
44
投票

您应该使用_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 ...
}

16
投票

exit()刷新IO缓冲区,并做一些其他的事情一样通过atexit()注册的运行功能。 exit()所调用_end( )

_exit()刚刚结束,而不这样做的过程。创建例如守护,当你调用_exit()从父进程。

自从发现main()是一个功能?你是否想知道在第一个地方叫呢?当AC程序运行你在运行shell提供可执行文件路径为“EXEC”系统调用和控制传递给内核,后者又调用每一个可执行_start()的启动函数,调用你的main(),当main()返回然后调用_end()一些C实现使用_end()_start()名称稍有不同...

exit()_exit()调用_end()

通常情况下 - 每一个main()应该有一个和唯一一个exit()电话。 (或在main()的最后返回)


2
投票

出口()是关于_exit的顶部(),使用常规的C库。

有不同之处:

  1. _exit()不会刷新标准输入输出缓冲器,而出口()刷新退出之前标准输入输出缓冲器。
  2. 而退出()可以用一些功能(即ON_EXIT或at_exit)进行一些清理过程如果注册现有程序之前,需要什么_exit()不能完成清理过程。

出口(状态)简单地将退出状态到_exit(状态)。建议每次执行fork()的,孩子和家长,一个使用_exit(),另一个使用出口之间其中之一()。


0
投票

fork()的子分支,它通常是不正确的使用exit(),因为这可能会导致标准输入输出缓冲器被刷新两次,被意外删除临时文件。

http://www.unixguide.net/unix/programming/1.1.3.shtml:摘自

© www.soinside.com 2019 - 2024. All rights reserved.