我有一个由其父级监控的进程。孩子遇到了导致它调用的错误abort
。该进程不会篡改中止进程,因此它应该按预期进行(转储核心,终止)。父母应该检测到孩子的终止并触发一系列事件来响应失败。孩子是多线程和复杂的。
这是我从中看到的ps
:
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND
0 1000 4929 1272 20 0 85440 6792 wait S+ pts/2 0:00 rxd
1 1000 4930 4929 20 0 0 0 exit Zl+ pts/2 38:21 [rxd] <defunct>
所以孩子(4930)已经终止。这是一个僵尸。正如预期的那样,我无法附加到它。但是,父级 (4929) 仍被阻止:
int i;
// ...
waitpid (-1, &i, 0);
所以看起来孩子是一个僵尸,但不知何故还没有完成它的父母收割它所需的一切。我认为,这个WCHAN
领域是一个有价值的线索。exit
平台为 64 位 Linux,Ubuntu 13.04,内核 3.8.0-30。孩子似乎没有倾倒核心或做任何事情。我已经离开系统几分钟,没有任何改变。
有谁知道可能是什么原因造成的,或者我能做些什么?
更新:另一个有趣的信息——如果我kill -9
是父进程,子进程就会消失。这有点莫名其妙,因为父进程是微不足道的,只是阻塞在waitpid
. 此外,当这个问题发生时,我没有得到任何核心转储(来自孩子)。
更新:似乎孩子被困在了schedule
,从exit_mm
调用,从调用do_exit
。我想知道为什么exit_mm
会打电话schedule
。我想知道为什么杀死父母会解开它。