linux僵尸进程
Ⅰ linux下僵尸态的进程是怎样引起的 csdn或chinaunix
当然会成为僵尸进程,你的C、D子进程比父进程先结束,
在fork ()/execve()过程中,假设子进程结束时父进程仍存在,而父进程fork()之前既没安装SIGCHLD信号处理函数调用waitpid()等待子进程结束,又没有显式忽略该信号,则子进程成为僵尸进程,无法正常结束,此时即使是root身份kill -9也不能杀死僵尸进程。补救办法是杀死僵尸进程的父进程(僵尸进程的父进程必然存在),僵尸进程成为"孤儿进程",过继给1号进程init,init始终会负责清理僵尸进程。
僵尸进程的避免:
(1) 父进程通过wait和waitpid等函数等待子进程结束,这会导致父进程挂起。
(2) 如果父进程很忙,那么可以用signal函数为SIGCHLD安装handler,因为子进程结束后, 父进程会收到该信号,可以在handler中调用wait回收。
(3) 如果父进程不关心子进程什么时候结束,那么可以用signal(SIGCHLD, SIG_IGN) 通知内核,自己对子进程的结束不感兴趣,那么子进程结束后,
内核会回收, 并不再给父进程发送信号。
(4) 还有一些技巧,就是fork两次,父进程fork一个子进程,然后继续工作,子进程fork一 个孙进程后退出,那么孙进程被init接管,孙进程结束后,
init会回收。不过子进程的回收 还要自己做。
Ⅱ Linux里面什么是僵尸进程
僵尸进程是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程都将成为一个僵尸进程。如果父进程先退出,子进程被init接管,子进程退出后init会收回其占用的相关资源。
我们都知道进程的工作原理。我们启动一个程序,开始我们的任务,然后等任务结束了,我们就停止这个进程。进程停止后,该进程就会从进程表中移除。
你可以通过System-Monitor查看当前进程。
In UNIX System terminology, a process that has terminated,but whose parent
has not yet waited for it, is called a
zombie.在Unix系统中,一个进程结束了,但是它的父进程没有等待它,那么它将变成一个僵尸进程。但是如果该进程的父进程已经先结束了,那么该进程就不会变僵尸进程,因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程,看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由init来接管他,成为他的父进程。
怎么查看僵尸进程?
利用命令ps,可以看到有父进程ID为1的进程是孤儿进程;s状态为z的是僵尸进程。
注意:孤儿进程是尚未终止但已停止的进程,但其父进程已经终止,由init收养;而僵尸进程则是已终止的进程,其父进程不一定终止。