当前位置: 技术问答>linux和unix
【如何彻底杀死子进程】Kill -9子进程后进程呈僵死状态
来源: 互联网 发布时间:2016-05-17
本文导语: 应用程序中,父进程A创建子进程B,C,然后要Kill子进程,kill(pid,SIGKILL)。 发现Kill后,子进程呈僵死状态,没有完全清除,子进程各个线程的PID也没有释放。 这样,操作多次后(反复创建和杀死),不能创建任何进...
应用程序中,父进程A创建子进程B,C,然后要Kill子进程,kill(pid,SIGKILL)。
发现Kill后,子进程呈僵死状态,没有完全清除,子进程各个线程的PID也没有释放。
这样,操作多次后(反复创建和杀死),不能创建任何进程,系统提示“sh:Cannot fork”。
请问该如何彻底Kill子进程,还是我的这个系统有问题?
发现Kill后,子进程呈僵死状态,没有完全清除,子进程各个线程的PID也没有释放。
这样,操作多次后(反复创建和杀死),不能创建任何进程,系统提示“sh:Cannot fork”。
请问该如何彻底Kill子进程,还是我的这个系统有问题?
|
把子进程的父进程杀死就可以了。因为子进程退出后要等到其父进程调用wait后,该进程项才会从进程表里面删除。
|
这个是所谓的zombie(僵尸进程)
引用一段:
在fork()/execve()过程中,假设子进程结束时父进程仍存在,而父进程fork()之前既没安装SIGCHLD信号处理函数调用waitpid()等待子进程结束,又没有显式忽略该信号,则子进程成为僵尸进程,无法正常结束,此时即使是root身份kill -9也不能杀死僵尸进程。补救办法是杀死僵尸进程的父进程(僵尸进程的父进程必然存在),僵尸进程成为"孤儿进程",过继给1号进程init,init始终会负责清理僵尸进程。
僵尸进程是指的父进程已经退出,而该进程dead之后没有进程接受,就成为僵尸进程.(zombie)进程
引用一段:
在fork()/execve()过程中,假设子进程结束时父进程仍存在,而父进程fork()之前既没安装SIGCHLD信号处理函数调用waitpid()等待子进程结束,又没有显式忽略该信号,则子进程成为僵尸进程,无法正常结束,此时即使是root身份kill -9也不能杀死僵尸进程。补救办法是杀死僵尸进程的父进程(僵尸进程的父进程必然存在),僵尸进程成为"孤儿进程",过继给1号进程init,init始终会负责清理僵尸进程。
僵尸进程是指的父进程已经退出,而该进程dead之后没有进程接受,就成为僵尸进程.(zombie)进程
|
是当时父进程阻塞了,没有去处理子进程的退出信号,就成了僵死进程。
|
在SIGCHLD信号里进行wait操作,就可以避免僵死进程
|
kill 父进程
|
呵呵~~~,你这个多次也太多了吧,僵尸进程占用的资源极少,除了PCB未释放。
个人比较偏向于7楼的建议,在SIGCHLD信号里进行wait操作。
个人比较偏向于7楼的建议,在SIGCHLD信号里进行wait操作。