免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3917 | 回复: 5
打印 上一主题 下一主题

kill -0 为何不能真确检测到进程 [复制链接]

论坛徽章:
1
15-16赛季CBA联赛之四川
日期:2016-02-15 17:12:32
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-07-18 11:57 |只看该作者 |倒序浏览

  1. 28         int exec() {
  2. 29                 const char      *pname=m_procname.c_str();
  3. 30                 const char      *pparam=m_param.c_str();
  4. 31                 if (m_num==0) {
  5. 32                         printf("restart filed num lager restart tiems \n");
  6. 33                         return 0;
  7. 34                 }
  8. 35                 m_pid=fork();
  9. 36                 if (m_pid < 0) {
  10. 37                         return -1;
  11. 38                 } else if(m_pid == 0) {
  12. 39                         if (execlp(pname,pname,pparam,0) < 0) {
  13. 40                                 exit(1);
  14. 41                         }
  15. 42                 } else {
  16. 43                         printf("Begin Start [%s][%s][%d]\n",m_procname.c_str(),m_param.c_str(),m_pid);
  17. 44                         if ( kill(m_pid,0)<0  && errno == ESRCH) {
  18. 45                                 printf("Process[%s][%s][%s] Start Error\n",pname,pparam,strerror(errno));
  19. 46                                 printf ("Process [%d] not exist\n",m_pid);
  20. 47                                 m_pid=0;
  21. 48                         }
  22. 49                 }
  23. 50                 return 0;
  24. 51         }
复制代码
进程已经退出可,为何在44行没有进入执行呢?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2011-07-18 12:18 |只看该作者
44 行是一个糟糕的编程风格。
好的风格应该是
  1. ret = kill();
  2. if ( ret == -1 ){
  3.     if ( errno == ESRCH ){
  4.         .......
  5.     }
  6.     else if ( ...... ){
  7.         ........
  8.     }
  9.     else{
  10.         ......
  11.     }
  12.     ........
  13. }
复制代码

论坛徽章:
1
15-16赛季CBA联赛之四川
日期:2016-02-15 17:12:32
3 [报告]
发表于 2011-07-18 12:38 |只看该作者
execlp 函数执行了一个不存在的程序,子进程退出,为何kill还能检测到该进程呢?help

论坛徽章:
0
4 [报告]
发表于 2011-07-18 12:50 |只看该作者
程序里面sleep一下,程序外面ps一下,看看进程是否还在,说不定状态是Z

论坛徽章:
1
15-16赛季CBA联赛之四川
日期:2016-02-15 17:12:32
5 [报告]
发表于 2011-07-18 12:55 |只看该作者
不是僵死啊

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:45
6 [报告]
发表于 2011-07-18 19:54 |只看该作者
原因是你kill的时候子进程还没退出,典型的多进程/线程同步问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP