当前位置: 技术问答>linux和unix
请问如何用C语言编写查找并杀死僵死进程的程序?在线等。。。。
来源: 互联网 发布时间:2015-07-18
本文导语: 如题,系统redhat9 | A example is listed as below: #include #include #include #include #include // kill all zombie processes int main () { DIR *pdir = NULL; struct dirent *pde = NULL; FILE *pf = NULL; char buf...
如题,系统redhat9
|
A example is listed as below:
#include
#include
#include
#include
#include
// kill all zombie processes
int main ()
{
DIR *pdir = NULL;
struct dirent *pde = NULL;
FILE *pf = NULL;
char buff[128];
char buff2[128];
char *pstr = NULL;
int pid, ppid;
int n;
pdir = opendir("/proc");
if (!pdir)
{
perror("open /proc fail.n");
return -1;
}
while ((pde = readdir(pdir)))
{
if ((pde->d_name[0] d_name[0] > '9'))
{
continue;
}
sprintf(buff, "/proc/%s/status", pde->d_name);
pf = fopen(buff, "r");
if (pf)
{
n = fread(buff, 1, 127, pf);
close(pf);
buff[n] = 0;
pstr = strstr(buff, "(zombie)");
if (pstr)
{
pid = atoi(pde->d_name);
kill(pid, SIGSTOP);
}
}
}
closedir(pdir);
return 0;
}
#include
#include
#include
#include
#include
// kill all zombie processes
int main ()
{
DIR *pdir = NULL;
struct dirent *pde = NULL;
FILE *pf = NULL;
char buff[128];
char buff2[128];
char *pstr = NULL;
int pid, ppid;
int n;
pdir = opendir("/proc");
if (!pdir)
{
perror("open /proc fail.n");
return -1;
}
while ((pde = readdir(pdir)))
{
if ((pde->d_name[0] d_name[0] > '9'))
{
continue;
}
sprintf(buff, "/proc/%s/status", pde->d_name);
pf = fopen(buff, "r");
if (pf)
{
n = fread(buff, 1, 127, pf);
close(pf);
buff[n] = 0;
pstr = strstr(buff, "(zombie)");
if (pstr)
{
pid = atoi(pde->d_name);
kill(pid, SIGSTOP);
}
}
}
closedir(pdir);
return 0;
}
|
僵死进程是因为其父进程没有回收子进程的资源
只要在其父进程里加入回收子进程资源的程序就可以了
定义如下函数
/**
* 当有子进程死时,主进程所做的操作,在进程数组中把相应的进程号置0
*/
static void sig_child(int signo)
{
pid_t pid;
int stat,ii;
while((pid=waitpid(-1,&stat,WNOHANG))>0);
return;
}
在主进程开始时加入下面一个语句,用语捕获子进程死的信号
signal(SIGCHLD,sig_child);
只要在其父进程里加入回收子进程资源的程序就可以了
定义如下函数
/**
* 当有子进程死时,主进程所做的操作,在进程数组中把相应的进程号置0
*/
static void sig_child(int signo)
{
pid_t pid;
int stat,ii;
while((pid=waitpid(-1,&stat,WNOHANG))>0);
return;
}
在主进程开始时加入下面一个语句,用语捕获子进程死的信号
signal(SIGCHLD,sig_child);
|
要想清除其他进程的僵死进程,只有把那个产生僵死进程的进程砍了!
这个是属于编程上的问题,程序处理好的话,是不会有僵死进程的。
这个是属于编程上的问题,程序处理好的话,是不会有僵死进程的。
|
用ps列出没有父进程的进程然后用kill杀死他。
|
up
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。