在尝试杀死父进程时,子进程仍在运行

时间:2012-12-20 15:54:13

标签: c linux operating-system fork shared-memory

给出以下代码:

分叉:

if(strcmp(str,"mkDir")==0)
            {
                str = strtok(NULL," ");
                switch(pid_child = fork())
                {
                        case -1: 
                        {
                            printf("Problem with producing a new process!\n");
                            exit(1);
                            break;
                        }
                        case 0: 
                        {
                            wait(1);
                            strcat(curRoot,str);
                            strcat(curRoot,"\\");
                            if(num_dir>0)
                            {
                                free(arr);
                                num_dir=0;
                            }
                            if(numFile>0)
                            {
                                free(files);
                                numFile=0;
                            }
                            break;
                        }
                        default:
                        {
                            pid = getpid();
                            *cur_pid = pid;
                            arr = add_dir(arr,str,pid_child,&num_dir);
                            break;
                        }
                }
            }//if MKDIR

试图杀死进程:

struct Directory* rmDir(struct Directory* dirs,char* name,int *size)
{
    int i,m=0,j;
    struct Directory* temp=NULL;
    j = find_dir(dirs,name,*size);
    if(j==-1)
    {
        printf("The directory does not exist\n");
        return dirs;
    }
    else
    {
        temp = (struct Directory*)malloc(sizeof(struct Directory)*((*size)-1));
        for (i=0; i<*size;i++)
        {
            if(i!=j)
            {
                temp[m]=dirs[i];
                m++;
            }
        }//for
        kill(dirs[j].dir_pid,SIGKILL);
        (*size)--;
        free(dirs);
        printf("Directory - %s was removed successfully!\n",name);
        return temp;
    }
}//rmDir

当我尝试杀死“父亲”进程时,子进程继续运行?

为什么?

此致

2 个答案:

答案 0 :(得分:1)

问题是你只杀了一个进程。 SIGKILL仅发送到您指定的一个进程。您可以使用进程组一次性将其发送给多个,但是它全部或全部,这对此没有帮助。

所以,首先,不要使用SIGKILL,使用SIGTERM。

然后,在子进程中安装SIGTERM处理程序。处理程序应该依次发信号通知自己的孩子,然后退出。

您需要阅读signalsigaction。有手册页和许多网络资源。

答案 1 :(得分:0)

如果孩子的父进程被终止,子进程将继续运行,直到它正常退出或中止。由于子进程的父进程不存在,子进程变为zombie并且它的返回值和核心数据结构被保留以由父进程收集。

在Linux上,init进程重新拥有僵尸进程,free是相关内存。