无法检测子进程是否已被杀死

时间:2016-06-05 18:37:28

标签: c++

我在stackoverflow上读了无数次,以确定进程是否正在运行,应该使用kill(pid,0)但是我不能让它工作

这是我的代码,它无法检测子进程何时被杀死,我不明白为什么

(对不起,但是在stackoverflow上转义的代码只是长代码的痛苦)

#include <sys/signal.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>

int main()
{
int pid = fork();

if (pid < 0)
{
    printf("Forking failed\n");
} 
else if (pid == 0) // child process
{ 
    do
    {
        printf("child process\n");  
        sleep(1);
    }while(1);
    //execvp("ls", NULL); //launches the application
} 
else //parent process
{ 
    printf("parent process\n");
    for(int i=0;i<10;i++)
    {
        if(i==5)
            kill(pid,SIGTERM); //kills the child process
        if(kill(pid, 0) == 0)
            printf("process child %d is runnig\n",pid);
        else if(kill(pid, 0) == -1)
        {
            switch(errno)
            {
                case ESRCH: printf("process child %d is not runnig\n",pid); break;
                case EPERM: printf("process child %d cannot be killed\n",pid); break;
                default: printf("%s\n",strerror(errno));    break;
            }
        }

        sleep(1); 
    }

} 
}

这是输出

parent process
process child 1918 is runnig
child process
process child 1918 is runnig
child process
process child 1918 is runnig
child process
process child 1918 is runnig
child process
process child 1918 is runnig
child process
process child 1918 is runnig
process child 1918 is runnig
process child 1918 is runnig
process child 1918 is runnig
process child 1918 is runnig

2 个答案:

答案 0 :(得分:0)

在被wait()收到被杀死的子进程之前,其PID仍然有效,kill(pid, 0);将成功,因为PID存在。您的代码尝试kill()子进程,但未能wait()

请注意,即使在最好的情况下,kill(pid, 0);也不可靠。只有32766个不同的PID,不需要很长时间才能回收进程ID。

答案 1 :(得分:0)

好吧,我最终想通了

kill(pid,SIGTERM); //kills the child process
do
    {
       pid = waitpid(-1, NULL, WNOHANG);
   if(pid == 0)
      sleep(1);
}while(pid<=0);