您的位置:首页 > 其它

有关defunct进程(僵尸进程)的处理原则

2009-05-20 17:01 211 查看
僵尸进程:就是已经结束了的进程,但是没有从进程表中删除。太多了会导致进程表里面条目满了,进而导致系统崩溃,倒是不占用其他系统资源。

僵尸进程的查看:

ps -ef

出现:

root 13028 12956 0 10:51 pts/2 00:00:00 [ls] <defunct>

最后有defunct的标记,就表明是僵尸进程。

产生的原因:

每个Linux进程在进程表里都有一个进入点(entry),核心程序执行该进程时使用到的一切信息都存储在进入点。当用ps命令察看系统中的进程信息 时,看到的就是进程表中的相关数据。当以fork()系统调用建立一个新的进程后,核心进程就会在进程表中给这个新进程分配一个进入点,然后将相关信息存 储在该进入点所对应的进程表内。这些信息中有一项是其父进程的识别码。当这个进程走完了自己的生命周期后,它会执行exit()系统调用,此时原来进程表 中的数据会被该进程的退出码(exit code)、执行时所用的CPU时间等数据所取代,这些数据会一直保留到系统将它传递给它的父进程为止。由此可见,defunct进程的出现时间是在子进 程终止后,但是父进程尚未读取这些数据之前。

产生的例程:

#include "sys/types.h"

#include "sys/wait.h"

#include "stdio.h"

#include "unistd.h"

int main(int argc, char* argv[])

{

while(1)

{

pid_t chi = fork();

if(chi == 0)

{

execl("/bin/ls",NULL);

}

sleep(2);

}

}

对付这种的方法:

外部的方法:

执行pstree,看到:

|-sshd-+-sshd---bash

| |-sshd---sftp-server

| `-sshd-+-bash---vi

| |-bash---myfork---2*[ls]

也就是主进程是myfork

将myfork干掉就可以了

编程的方法:

1、主进程等待子进程

#include "sys/types.h"

#include "sys/wait.h"

#include "stdio.h"

#include "unistd.h"

int main(int argc, char* argv[])

{

while(1)

{

pid_t chi = fork();

if(chi == 0)

{

execl("/bin/ls",NULL);

}

int status;

wait(&status);

sleep(2);

}

}

也就是加上了wait

2、在主进程里面补充对child 退出的signal的处理:

void sig_child(int signo)

{

pid_t   pid;

int   stat,i;

while((pid = waitpid(-1, &stat, WNOHANG)) > 0);

return;

}

signal(SIGCHLD,sig_child);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: