请教一个关于僵尸进程的问题

HyperMeta 2015-01-03 03:29:21
需要做一个进程监控程序M,对A、B、C、D等多个程序(或者进程)进行监控,可以通过M启动A、B、C、D,也可以通过M关闭A、B、C、D;
启动已经实现了,是在M中创建一个子进程,然后在子进程中启动程序(或者进程),并记录下改子进程的pid;
但是关闭的时候,想直接kill想对应的子进程ID,但是,这样会kill不掉,子进程会编程僵尸进程,请问有没有比较好的方法啊,找不到比较好的方法。
[/size]
...全文
279 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ma100 2015-01-14
  • 打赏
  • 举报
回复
kill -9 呢
山椒π 2015-01-14
  • 打赏
  • 举报
回复
直接kill,然后解决僵尸进程的问题比较简单。 方法如上述楼层 1)忽略SIGCHILD信号,这个方式最简单,但有时会给其他程序带来影响 struct sigaction sa; sa.sa_handler = SIG_IGN; #ifdef SA_NOCLDWAIT sa.sa_flags = SA_NOCLDWAIT; #else sa.sa_flags = 0; #endif sigemptyset (&sa.sa_mask); sigaction (SIGCHLD, &sa, NULL); 其中sigaction (SIGCHLD, &sa, NULL);换作sigaction (SIGCHLD, &new_sa, &old_sa);可以使用old_sa来保存之前的,之后可以再用sigaction (SIGCHLD, &old_sa, NULL);来恢复。 2)利用孙子进程来处理事务,fork两次 pid_t pid; pid = fork(); if (pid < 0){ printf ("Error to fork while focus out/n"); }else if(pid == 0){ pid = fork(); if (pid < 0){ printf ("Error to fork while focus out/n"); }else if(pid == 0){ //孙子进程处理 execlp ("gedit","gedit",NULL, NULL); }else{ exit(0); //子进程退出 } } //父进程继续 3)使用waitpid或者wait来处理 其中waitpid(pid, NULL, WNOHANG);使用参数WNOHANG可以在子进程未退出时直接返回而不等待,但后面还是要继续判断处理。
南边风景好 2015-01-13
  • 打赏
  • 举报
回复
让父进程创建的子进程a再去创建一个子进程b去执行程序,然后子进程a退出,这样由于a已结束,其子进程b就会由init进程接管,就不会有僵尸进程了
河南智学未来 2015-01-11
  • 打赏
  • 举报
回复
子进程变成僵尸进程,楼主写的父进程应该是设计的没有时间收回子进程咯,可以考虑在父进程中有时间回收子进程,当然思路很重要啦, 3楼的建议也不错的
极客代码 2015-01-05
  • 打赏
  • 举报
回复
http://www.studyemb.cn/forum.php?mod=viewthread&tid=4&extra=page%3D1
  • 打赏
  • 举报
回复
http://www.cnblogs.com/anker/p/3271773.html 2种办法,一种就是主进程wait,还有一种就是主进程fork完之后忽略SIGCHLD。

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧