我一直在试图找出叉EXEC机制是如何内部的Linux使用。一切都会在按计划直到某些网页开始迷惑我。
有人说,一个孩子的过程要严格,而不是用一个简单的_exit()
或exit()
一个正常返回的main()
。
据我所知,Linux的shell叉高管的外部命令中的每一个;假设我上面说的是真的,得出的结论是,没有这些外部命令或任何其他执行Linux外壳内部发生的可以做正常的回报!
维基百科和其他一些网页要求我们必须使用_exit()
只是为了防止父母的临时文件子进程造成的缺失,而标准输入输出缓冲器的可能二次冲洗可能发生。虽然我理解前者,我没有线索缓存的双冲洗怎么可能是有害的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 ...
}
exit()
刷新IO缓冲区,并做一些其他的事情一样通过atexit()
注册的运行功能。 exit()
所调用_end( )
_exit()
刚刚结束,而不这样做的过程。创建例如守护,当你调用_exit()
从父进程。
自从发现main()
是一个功能?你是否想知道在第一个地方叫呢?当AC程序运行你在运行shell提供可执行文件路径为“EXEC”系统调用和控制传递给内核,后者又调用每一个可执行_start()
的启动函数,调用你的main()
,当main()
返回然后调用_end()
一些C实现使用_end()
&_start()
名称稍有不同...
exit()
和_exit()
调用_end()
通常情况下 - 每一个main()
应该有一个和唯一一个exit()
电话。 (或在main()
的最后返回)
出口()是关于_exit的顶部(),使用常规的C库。
有不同之处:
出口(状态)简单地将退出状态到_exit(状态)。建议每次执行fork()的,孩子和家长,一个使用_exit(),另一个使用出口之间其中之一()。
在
fork()
的子分支,它通常是不正确的使用exit()
,因为这可能会导致标准输入输出缓冲器被刷新两次,被意外删除临时文件。