涉及到stream程树时,SIGTERM和SIGKILL有什么区别?
当一个根线程接收到SIGKILL的时候,它会被干干净净地杀死,还是会把子线程当作僵尸呢?
是否有任何信号可以发送到根线程,通过不离开任何僵尸线程干净地退出?
谢谢。
如果你杀了根进程(父进程),这应该让孤儿,而不是僵尸的孩子。 孤儿是在你杀死一个进程的父进程的时候创建的,内核使得init成为孤儿的父进程。 init应该等到孤儿死后再用wait来清理它。
当一个进程(不是父进程)结束,并且其父进程没有从进程表中退出时,僵尸进程会被创建。
这听起来像你担心离开孤儿,因为根据定义,当你杀死一个僵尸父母的过程中,僵尸的孩子本身就死了。
杀死你的孤儿,使用杀死-9,这是相当于SIGKILL。
这里是一个更深入的教程,以杀死Linux上的东西: http : //riccomini.name/posts/linux/2012-09-25-kill-subprocesses-linux-bash/
你不能通过信号来控制它。 只有它的父进程可以通过调用waitpid()
或设置SIGCHLD
信号处理程序来控制它。 有关详细信息,请参见sigaction(2)
页中的SIGCHLD
和SA_NOCLDWAIT
。
此外,子线程会发生什么情况取决于Linux内核版本。 使用2.6的POSIX线程,查杀主线程会导致其他线程干净地退出。 使用2.4 LinuxThreads,每个线程实际上是一个独立的进程, SIGKILL
不会让根线程序有机会告诉别人关闭,而SIGTERM
却是这样。