用C中的父进程杀死后台进程

问题描述

我的主函数中有以下代码

pid_t pid;
pid = fork(); //Two processes are made

if (pid > 0 && runBGflag==0) //Parent process. Waits for child termination and prints exit status
{
    int status;
    if (waitpid(pid,&status,0) == pid && WIFEXITED(status))
    {
        printf("Exitstatus [");
        for (int i = 0; i < noOfTokens; i++)
        {
            printf("%s ",commands[i]);
        }
        printf("\b] = %d\n",WEXITSTATUS(status));
    }
}
else if (pid == 0)  //Child process. Executes commands and prints error if something unexpected happened
{
     if (runBGflag==1) insertElement(getpid(),ptr);
     execvp(commands[0],commands);
     printf ("exec: %s\n",strerror(errno));
     exit(1);
}

简而言之,创建了一个子进程,如果设置了 runBackGround 标志,父进程将不会等待子进程退出,而是继续运行。如果创建了后台进程,则后台进程的PID 存储在一个列表中。稍后,这个函数调用

void delete_zombies(void)
{
    pid_t kidpid;
    int status;
    char buffer[1337];
 


    while ((kidpid = waitpid(-1,WNOHANG)) > 0)
    {
        removeElement(kidpid,buffer,1337);
        printf("Child %ld terminated\n",kidpid);
        printf("its command was %s\n",buffer);
    }
}

这个函数只是检查是否有任何子进程已经死亡,在这种情况下删除它们。然后它将在列表中搜索孩子的 PID,将其删除并打印出来。

问题是,delete_zombies 函数会发现一个子进程已经死亡,然后会尝试将其从列表中删除,但它只找到一个空列表,就好像子进程从未将其 PID 插入列表中一样。

这真的很奇怪,因为delete_zombies只找到一个死的子进程,当创建了一个设置了背景标志的进程,所以我们知道insertElement肯定被调用了,但奇怪的是当父进程检查列表时什么都没有

是因为子进程和父进程有单独的列表,还是PID可能有问题?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)