有关defunct进程的问题
我想写一个监视程序,现在的问题是,processp里保存的是N个已经启动的进程信息,监视程序每隔一段时间去查询下进程的状态,如果该进程不存在的话,就重新开一个新的进程.进程名,所在路径等信息都在processp里保存.用fork函数来得到新进程的ID,当监视程序发现,该进程不存在,然后启动他,新ID取得,更新到processp里....,然而,当由监视程序开启的那个进程再次死亡时,会在系统里留下个defunct进程,用kill(processp[i].Pid, 0)也能找的到该进程,但是他已经死亡了....,原因我网上找了找,是由于fork引起的,请问如何能不产生defunct进程...,或者能有办法KILL掉它吗
while(1)
{
/* MAX process数 */
for(i=0; i<MAX_PROC; i++)
{
/* process存在 */
if(!kill(processp[i].Pid, 0))
{
continue ;
}
/* 已经存在的process取得 */
sprintf(cmnd, "ps -e | grep -w %s >%s", processp[i].ProcessName, TMPFNM) ;
system(cmnd) ;
findflg = 0 ;
listp = fopen(TMPFNM, "r") ;
if(listp != NULL)
{
while(fgets(line,sizeof(line),listp) != NULL)
{
p2 = strstr(line, processp[i].ProcessName);
if(p2 != NULL)
{
/*process id 取得 */
p = (char *)strtok(line, " n") ;
processp[i].Pid = atoi(p); /* process id 再设定 */
findflg = 1 ;
}
}
fclose(listp) ;
}
/* process 不存在 */
(findflg == 0)
{
sprintf(target, "%s/%s", processp[i].ProcessPath, processp[i].ProcessName) ; /* process 设置 */
if ((pid = fork()) == -1)
{
printf("Fork errorn");
exit(1);
}
if (pid == 0) /* 子process */
{
execv(target, argvbuf); /* run processs */
exit(1);
}
processp[i].Pid = pid ; /* PID保存 */
}
}
sleep(wtim) ;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
处理一下SIGCHLD 信号.
用wait 或waitpid 函数等待一下子进程的退出状态可以避免僵尸进程.