求apue一段解释

发布于 2022-10-15 09:07:26 字数 1689 浏览 27 评论 0

If we want to write a process so that it forks a
child but we don't want to wait for the child to complete and we don't want the child to become a zombie until
we terminate, the trick is to call fork twice.

  1. #include "apue.h"
  2. #include <sys/wait.h>
  3. int
  4. main(void)
  5. {
  6. pid_t
  7. pid;
  8. if ((pid = fork()) < 0) {
  9. err_sys("fork error");
  10. } else if (pid == 0) {
  11. /* first child */
  12. if ((pid = fork()) < 0)
  13. err_sys("fork error");
  14. else if (pid > 0)
  15. exit(0);
  16. /* parent from second fork == first child */
  17. /*
  18. * We're the second child; our parent becomes init as soon
  19. * as our real parent calls exit() in the statement above.
  20. * Here's where we'd continue executing, knowing that when
  21. * we're done, init will reap our status.
  22. */
  23. sleep(2);
  24. printf("second child, parent pid = %d\n", getppid());
  25. exit(0);
  26. }
  27. if (waitpid(pid, NULL, 0) != pid)
  28. err_sys("waitpid error");
  29. /* wait for first child */
  30. /*
  31. * We're the parent (the original process); we continue executing,
  32. * knowing that we're not the parent of the second child.
  33. */
  34. exit(0)
  35. }

复制代码没看出来两次fork与一次fork有什么区别,换言之它所说的这个“trick",没看出有什么意义。
如果写一个程序fork出子进程,然后你进程退出,子进程交给init了,该子进程也没有成为僵尸吧,也没有在wait它,这不是已经达到了文中的要求?
而这个trick里,无非是A fork B, B fork C , B exit ,A exit,C controled by init。抛弃A进程,剩下的过程跟直接写一个程序B fork C有区别么?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

故事灯 2022-10-22 09:07:26

本帖最后由 cokeboL 于 2011-04-20 09:24 编辑

如果A fork C,A是一直存在的服务,那当C退出了需要在A中回收C,否则C残留继续占用系统资源,但在A中每个都子进程退出都处理又不确定它什么时候退出,所以干脆fork个立刻退出然后能立刻回收的B,让C退出时由init自动处理吧。

接触开发时间比较短,单凭字面和代码理解的,不知道对不对。

玩心态 2022-10-22 09:07:26

本帖最后由 apor 于 2011-04-20 15:56 编辑

回复 2# cokeboL

谢谢,不过你没看我说的意思啊...
我是说直接一次fork跟两次fork有区别么。我怎么觉得没区别似的。
A fork B , A exit , B controled by init (这里我们也没有waitpid(B),而B也没有成为僵尸,不是已经达到了文中的要求了么?)
A fork B , B fork C, B exit, A exit, C controled by init(B fork C的这段过程,明显与上面的一致嘛。有什么区别?这种twice fork解决了什么问题吗?)

醉生梦死 2022-10-22 09:07:26

本帖最后由 cokeboL 于 2011-05-17 16:34 编辑

回复  cokeboL

谢谢,不过你没看我说的意思啊...
我是说直接一次fork跟两次fork有区别么。我怎么觉得没 ...
apor 发表于 2011-04-20 15:47

代码中if(waitpid(...) != pid)的时候,是回收过的。

上班电脑没环境,没法验证,LZ试试打印下看看对不对,我晚上回家再试试。

-柠檬树下少年和吉他 2022-10-22 09:07:26

回复 3# apor

    补充一下,把A当成服务,一直存在的。

无悔心 2022-10-22 09:07:26

A 先生 B 然后等着 B结束, B生成了C,退出,这样A就等到了B,B不会是一个僵尸进程 。C的父进程B退出了。C会发现父进程变为了init。等到他执行完毕, init 接收他,这样C也不会变为僵尸进程。

这样系统中就没有了僵尸进程。

不可一世的女人 2022-10-22 09:07:26

A 先生 B 然后等着 B结束, B生成了C,退出,这样A就等到了B,B不会是一个僵尸进程 。C的父进程B退出了。C会 ...
crazyhadoop 发表于 2011-04-21 09:13

    学习了...

静待花开 2022-10-22 09:07:26

回复 6# crazyhadoop

    B生成了C,B退出,C发现自己的父进程变成了init,B不人成为僵尸,C更不是。
请问,这样子不是已经满足了要求了么?这里有人是僵尸么?有人等子进程了么?都没有吧?
既然这样子就已经达到目的的,为什么非要twice fork?

草莓酥 2022-10-22 09:07:26

回复 4# cokeboL

    嗯,B当然是回收过的...
你好像还是没懂我在问什么。

想挽留 2022-10-22 09:07:26

回复 8# apor

B生成了C,B退出,C发现自己的父进程变成了init,B不人成为僵尸,C更不是。

那这不就是2次 fork了吗?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文