求apue一段解释
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.
- #include "apue.h"
- #include <sys/wait.h>
- int
- main(void)
- {
- pid_t
- pid;
- if ((pid = fork()) < 0) {
- err_sys("fork error");
- } else if (pid == 0) {
- /* first child */
- if ((pid = fork()) < 0)
- err_sys("fork error");
- else if (pid > 0)
- exit(0);
- /* parent from second fork == first child */
- /*
- * We're the second child; our parent becomes init as soon
- * as our real parent calls exit() in the statement above.
- * Here's where we'd continue executing, knowing that when
- * we're done, init will reap our status.
- */
- sleep(2);
- printf("second child, parent pid = %d\n", getppid());
- exit(0);
- }
- if (waitpid(pid, NULL, 0) != pid)
- err_sys("waitpid error");
- /* wait for first child */
- /*
- * We're the parent (the original process); we continue executing,
- * knowing that we're not the parent of the second child.
- */
- exit(0)
- }
复制代码没看出来两次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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
本帖最后由 cokeboL 于 2011-04-20 09:24 编辑
如果A fork C,A是一直存在的服务,那当C退出了需要在A中回收C,否则C残留继续占用系统资源,但在A中每个都子进程退出都处理又不确定它什么时候退出,所以干脆fork个立刻退出然后能立刻回收的B,让C退出时由init自动处理吧。
接触开发时间比较短,单凭字面和代码理解的,不知道对不对。
本帖最后由 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解决了什么问题吗?)
本帖最后由 cokeboL 于 2011-05-17 16:34 编辑
代码中if(waitpid(...) != pid)的时候,是回收过的。
上班电脑没环境,没法验证,LZ试试打印下看看对不对,我晚上回家再试试。
回复 3# apor
补充一下,把A当成服务,一直存在的。
A 先生 B 然后等着 B结束, B生成了C,退出,这样A就等到了B,B不会是一个僵尸进程 。C的父进程B退出了。C会发现父进程变为了init。等到他执行完毕, init 接收他,这样C也不会变为僵尸进程。
这样系统中就没有了僵尸进程。
学习了...
回复 6# crazyhadoop
B生成了C,B退出,C发现自己的父进程变成了init,B不人成为僵尸,C更不是。
请问,这样子不是已经满足了要求了么?这里有人是僵尸么?有人等子进程了么?都没有吧?
既然这样子就已经达到目的的,为什么非要twice fork?
回复 4# cokeboL
嗯,B当然是回收过的...
你好像还是没懂我在问什么。
回复 8# apor
那这不就是2次 fork了吗?