[问题] 短暂成为僵尸行程是正常的吗?[已解决]

楼主: Hazukashiine (私は幸せです)   2017-10-18 01:58:15
开发平台(Platform): (Ex: Win10, Linux, ...)
Linux
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
gcc-6
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
问题(Question):
短暂成为僵尸行程是正常的吗?
喂入的资料(Input):
预期的正确结果(Expected Output):
即使子行程提早结束也不会变成僵尸行程
错误结果(Wrong Output):
程式码(Code):(请善用置底文网页, 记得排版)
if (pid < 0) {
perror("fork");
exit(EXIT_FAILURE);
}
else if (pid == 0) { // child process
system("sleep 0");
_exit(EXIT_SUCCESS);
}
else if (pid > 0) { // parent process
system("sleep 3"); // 子行程变成僵尸行程
waitpid(pid, &ret, 0); // 顺利回收子行程
}
补充说明(Supplement):
上述的实验就算子行程提早结束了
waitpid 好像还是可以顺利回收那个变成僵尸的子行程
这样产生短暂的僵尸行程是正常的吗 XDD (抓头
谢谢
== 已解决 ==
这应该是正常的
Synchronously waiting for the specific child processes in a (specific) order
may leave zombies present longer than the above-mentioned "short period of
time". It is not necessarily a program bug.
作者: LPH66 (-6.2598534e+18f)   2017-10-18 08:31:00
应该这样说: 僵尸行程的目的就是为了等父行程来收尸所以在父行程还有余力收尸时僵尸行程自然不会消失
作者: Bencrie   2017-10-18 09:41:00
zombie 不是 parent 没用 wait 去取 child 遗留的 exitcode 导致的吗?跟你 child 有没有提早结束无关吧
楼主: Hazukashiine (私は幸せです)   2017-10-18 09:50:00
嗯嗯 我在父行程加了 sleep 让子行程结束早于等待
作者: Darkautism (达卡特森)   2017-10-18 13:05:00
你应该用wait或join吧 sleep不是很好
作者: LPH66 (-6.2598534e+18f)   2017-10-18 16:29:00
他有 wait 啊, 只是故意晚 wait 而已说起来, 其实就是为了防止这篇讲的这种事才会有 SIGCHLD如果在 fork 前有先设定好 SIGCHLD 一来就 waitpid 清掉那就不会留着僵尸行程了这跟父行程的 main thread 在做什么可以不相关
作者: Bencrie   2017-10-18 21:15:00
那个 signal 小心使用就是。毕竟所有的 fork 都有效

Links booklink

Contact Us: admin [ a t ] ucptt.com