无法检测子进程是否已终止

Cannot detect if child process has been killed

本文关键字:终止 是否 子进程 检测      更新时间:2023-10-16

我一直在堆栈溢出上阅读无数次,以确定进程是否正在运行,应该使用 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 failedn");
} 
else if (pid == 0) // child process
{ 
    do
    {
        printf("child processn");  
        sleep(1);
    }while(1);
    //execvp("ls", NULL); //launches the application
} 
else //parent process
{ 
    printf("parent processn");
    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 runnign",pid);
        else if(kill(pid, 0) == -1)
        {
            switch(errno)
            {
                case ESRCH: printf("process child %d is not runnign",pid); break;
                case EPERM: printf("process child %d cannot be killedn",pid); break;
                default: printf("%sn",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

在被杀死的子进程被wait()收割之前,它的PID仍然有效,并且kill(pid, 0);会成功,因为PID存在。代码尝试kill()子进程,但无法为其wait()

请注意,即使在最好的情况下,kill(pid, 0);也不可靠。由于只有 32766 个不同的 PID,进程 ID 很快就会被回收。

好吧,

我终于想通了

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