作者Hazukashiine (みなさん、こんにちは)
看板C_and_CPP
标题[问题] 短暂成为殭屍行程是正常的吗?
时间Wed Oct 18 01:58:15 2017
开发平台(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. -- Wikipedia, Zombie process, Sec 2
--
Lorem ipsum dolor sit amet, cons
ectetuer adipiscing elit. Aenean co
mmodo ligula eget dolor. Aenean mas
sa. Cum sociis natoque penatibus et
magnis dis parturient montes, nasce
tur ridiculus mus. Donec quam felis
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.113.68.52
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1508263111.A.BA5.html
※ 编辑: Hazukashiine (140.113.68.52), 10/18/2017 02:44:06
1F:推 LPH66: 应该这样说: 殭屍行程的目的就是为了等父行程来收屍 10/18 08:31
2F:→ LPH66: 所以在父行程还有余力收屍时殭屍行程自然不会消失 10/18 08:31
3F:推 Bencrie: zombie 不是 parent 没用 wait 去取 child 遗留的 exit 10/18 09:41
4F:→ Bencrie: code 导致的吗?跟你 child 有没有提早结束无关吧 10/18 09:42
5F:→ Hazukashiine: 嗯嗯 我在父行程加了 sleep 让子行程结束早於等待 10/18 09:50
6F:推 Darkautism: 你应该用wait或join吧 sleep不是很好 10/18 13:05
7F:推 LPH66: 他有 wait 啊, 只是故意晚 wait 而已 10/18 16:29
8F:→ LPH66: 说起来, 其实就是为了防止这篇讲的这种事才会有 SIGCHLD 10/18 16:31
9F:→ LPH66: 如果在 fork 前有先设定好 SIGCHLD 一来就 waitpid 清掉 10/18 16:33
10F:→ LPH66: 那就不会留着殭屍行程了 10/18 16:33
11F:→ LPH66: 这跟父行程的 main thread 在做什麽可以不相关 10/18 16:34
12F:推 Bencrie: 那个 signal 小心使用就是。毕竟所有的 fork 都有效 10/18 21:15