Chinaunix

标题: kill -0 为何不能真确检测到进程 [打印本页]

作者: wujiajia    时间: 2011-07-18 11:57
标题: kill -0 为何不能真确检测到进程

  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行没有进入执行呢?
作者: flw    时间: 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. }
复制代码

作者: wujiajia    时间: 2011-07-18 12:38
execlp 函数执行了一个不存在的程序,子进程退出,为何kill还能检测到该进程呢?help
作者: drangon    时间: 2011-07-18 12:50
程序里面sleep一下,程序外面ps一下,看看进程是否还在,说不定状态是Z
作者: wujiajia    时间: 2011-07-18 12:55
不是僵死啊
作者: koolcoy    时间: 2011-07-18 19:54
原因是你kill的时候子进程还没退出,典型的多进程/线程同步问题




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2