首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在传统的Linux fork-exec中使用_exit()和exit()有什么区别?

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

Stack Overflow用户
提问于 2011-03-25 01:05:47
回答 4查看 43.2K关注 0票数 63

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

有人说,子进程应该严格使用_exit(),而不是简单的exit()或来自main()的正常返回。

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

维基百科&其他一些网页声称,我们使用_exit()只是为了防止一个子进程导致父母的临时文件被删除,同时可能会发生stdio缓冲区的双重刷新。虽然我理解前者,但我不知道双重刷新缓冲区会对Linux系统造成怎样的危害。

我花了一整天的时间在这上面...感谢您的任何澄清。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-03-25 01:29:41

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

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

在所有其他情况下,只需使用exit即可。正如您已经注意到的,Unix/Linux中的每个进程(除了init之外)都是另一个进程的子进程,因此在每个子进程中使用_exit将意味着exit在init之外是无用的。

代码语言:javascript
复制
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 ...
}
票数 57
EN

Stack Overflow用户

发布于 2014-02-14 22:07:13

exit()刷新io缓冲区,并执行其他一些操作,如运行atexit()注册的函数。exit()调用_end( )

_exit()只是在不这样做的情况下结束这个过程。例如,在创建守护进程时,您可以从父进程调用_exit()。

有没有注意到main()是一个函数?有没有想过最初是什么叫它的?当一个c程序运行你正在运行的外壳时,它提供了'exec‘系统调用的可执行路径,并且控制被传递给内核,内核反过来调用每个可执行_start()的启动函数,调用你的main(),当main()返回它,然后调用_end()时,C的一些实现使用稍微不同的名称来表示_end()和_start() ...

exit()和_exit()调用_end()

通常-对于每个main(),应该有一个&只有一个exit()调用。(或在main()的末尾返回)

票数 18
EN

Stack Overflow用户

发布于 2017-03-26 03:44:04

exit()位于_exit()的顶部,使用传统的C库。

这里有一些区别:

当exit()在退出前刷新stdio缓冲区时,

  1. _exit()不会刷新stdio缓冲区。
  2. _exit()不能执行清理过程,而exit()可以注册到某个函数(即on_exit或at_exit),以便在存在程序之前执行某些清理过程。

exit( status )只是将退出状态传递给_exit(status)。建议无论何时执行fork(),其中一个在子进程和父进程之间,一个使用_exit(),另一个使用exit()。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5422831

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档