Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 试图终止父进程时,子进程仍在运行_C_Linux_Operating System_Fork_Shared Memory - Fatal编程技术网

C 试图终止父进程时,子进程仍在运行

C 试图终止父进程时,子进程仍在运行,c,linux,operating-system,fork,shared-memory,C,Linux,Operating System,Fork,Shared Memory,给定以下代码: 分叉: if(strcmp(str,"mkDir")==0) { str = strtok(NULL," "); switch(pid_child = fork()) { case -1: { printf("

给定以下代码:

分叉:

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
struct Directory*rmDir(struct Directory*dirs,char*name,int*size)
{
int i,m=0,j;
结构目录*temp=NULL;
j=查找目录(目录、名称、*大小);
如果(j==-1)
{
printf(“目录不存在\n”);
返回目录;
}
其他的
{
temp=(结构目录*)malloc(sizeof(结构目录)*((*size)-1));

对于(i=0;i而言,问题在于您只终止了一个进程。SIGKILL只发送给您指定的一个进程。您可以使用进程组一次将其发送给多个进程,但要么全部发送,要么什么都不发送,这在这里没有帮助

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

然后,在子进程中安装一个SIGTERM处理程序。该处理程序应该依次向它自己的子进程发出信号,然后退出


您需要阅读
signal
sigaction
。这里有手册页和许多web资源。

问题是您只终止了一个进程。SIGKILL只发送到您指定的一个进程。您可以使用进程组一次发送到多个进程,但要么全部,要么什么都没有,这在这里没有帮助。

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

然后,在子进程中安装一个SIGTERM处理程序。该处理程序应该依次向它自己的子进程发出信号,然后退出


您需要阅读
signal
sigaction
。有手册页和许多web资源。

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


在Linux上,
init
进程重新设置僵尸进程的父进程,并
释放相关的内存。

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


在Linux上,
init
进程重新生成僵尸进程的父进程,并
释放相关内存。

阅读进程组。实际上,不,如果你想杀死任意子树,这不起作用。:(阅读进程组。实际上,不,如果你想杀死任意子树,这不起作用。)(