SIGESM和SIGKILL在进程树方面有什么区别?
当一个根线程收到SIGKILL时,它会被干净地杀死,还是会把它的子线程留给僵尸呢?
是否有任何信号可以通过不离开任何僵尸线程发送到根线程干净地退出?
感谢。
答案 0 :(得分:15)
如果你杀死根进程(父进程),这应该是孤儿,而不是僵尸儿。孤儿子是在你杀死一个进程的父进程时产生的,内核使init成为孤儿的父进程。 init应该等到孤儿死了,然后用等待来清理它。
当进程(而不是其父进程)结束且其父进程未从进程表中取出其退出状态时,将创建僵尸子进程。
听起来你好像担心留下孤儿,因为根据定义,当你杀死一个僵尸父进程时,僵尸孩子本身就会死亡。
要杀死你的孤儿,请使用kill -9,这是等效的SIGKILL。
这是一个更深入的教程,用于杀死linux上的东西: http://riccomini.name/posts/linux/2012-09-25-kill-subprocesses-linux-bash/
答案 1 :(得分:1)
你不能通过信号来控制它;只有其父进程可以通过调用waitpid()
或设置SIGCHLD
的信号处理程序来控制它。有关详细信息,请参阅SIGCHLD
联机帮助页中的SA_NOCLDWAIT
和sigaction(2)
。
此外,子线程的变化取决于Linux内核版本。使用2.6的POSIX线程,杀死主线程应该导致其他线程干净地退出。使用2.4 LinuxThreads,每个线程实际上是一个单独的进程,SIGKILL
不会让根线程有机会告诉其他人关闭,而SIGTERM
则会。