1

次のコードがあるとします。

フォーク:

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

「親」プロセスを強制終了しようとすると、子プロセスが実行され続けますか?

何故ですか ?

よろしく

4

2 に答える 2

1

問題は、1 つのプロセスだけを強制終了していることです。SIGKILL は、指定した 1 つのプロセスにのみ送信されます。プロセス グループを使用して一度に複数に送信することはできますが、その場合はすべてか無かであり、ここでは役に立ちません。

したがって、まず、SIGKILL を使用しないで、SIGTERM を使用してください。

次に、子プロセスに SIGTERM ハンドラをインストールします。ハンドラーは、自分の子に順番に通知してから終了する必要があります。

signalまたはを読む必要がありますsigaction。man ページと多くの Web リソースがあります。

于 2012-12-20T16:27:52.140 に答える
0

子プロセスが強制終了された場合、子プロセスは正常に終了するか中止されるまで実行を続けます。子の親プロセスが存在しないため、子プロセスはに変換されzombie、その戻り値とコアデータ構造は親によって収集されるように保持されます。

Linuxでは、initプロセスはゾンビプロセスと関連するメモリの親を変更します。free

于 2012-12-24T11:49:10.823 に答える