免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5235 | 回复: 18
打印 上一主题 下一主题

求apue一段解释 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-04-19 21:02 |只看该作者 |倒序浏览
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有区别么?

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
2 [报告]
发表于 2011-04-20 09:16 |只看该作者
本帖最后由 cokeboL 于 2011-04-20 09:24 编辑

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

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

论坛徽章:
0
3 [报告]
发表于 2011-04-20 15:47 |只看该作者
本帖最后由 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解决了什么问题吗?)

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
4 [报告]
发表于 2011-04-20 16:23 |只看该作者
本帖最后由 cokeboL 于 2011-05-17 16:34 编辑
回复  cokeboL

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


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

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

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
5 [报告]
发表于 2011-04-20 20:43 |只看该作者
回复 3# apor


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

论坛徽章:
1
天蝎座
日期:2013-12-06 18:23:58
6 [报告]
发表于 2011-04-21 09:13 |只看该作者
A 先生 B 然后等着 B结束, B生成了C,退出,这样A就等到了B,B不会是一个僵尸进程 。C的父进程B退出了。C会发现父进程变为了init。等到他执行完毕, init 接收他,这样C也不会变为僵尸进程。

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

论坛徽章:
0
7 [报告]
发表于 2011-04-21 11:05 |只看该作者
A 先生 B 然后等着 B结束, B生成了C,退出,这样A就等到了B,B不会是一个僵尸进程 。C的父进程B退出了。C会 ...
crazyhadoop 发表于 2011-04-21 09:13



    学习了...

论坛徽章:
0
8 [报告]
发表于 2011-04-22 15:48 |只看该作者
回复 6# crazyhadoop


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

论坛徽章:
0
9 [报告]
发表于 2011-04-22 15:55 |只看该作者
回复 4# cokeboL


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

论坛徽章:
1
天蝎座
日期:2013-12-06 18:23:58
10 [报告]
发表于 2011-04-22 15:55 |只看该作者
回复 8# apor



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


那这不就是2次 fork了吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP