【问题标题】:Process tree (fork) Linux进程树(fork)Linux
【发布时间】:2020-03-26 18:16:29
【问题描述】:

我需要在 linux 中使用 fork() 创建一个进程树。 树一定是这样的:

此外,每个进程都有一个随机 ID。所以在每个过程中,我们都要比较他的ID和他的儿子ID,并保持最小的ID。

所以,我尝试使用递归函数来处理树的左侧部分,但它不起作用......(管道有很多问题......)

(对不起,我的英语不好,因为我是法国人:()

int creerArbreGauche(int n,int m)
{
    if(m>0){
        if(fork()==0){
            printf("pid : %d m : %d \n",getpid(),m);
            if(m==(n-1)) //si on est au dernier proc
            {   
                printf("Premiere condition %d \n",id[0][m]);
                close(tube_G_FP[0]);
                write(tube_G_FP[1],&id[0][m],sizeof(int));
                creerArbreGauche(n,m-1);
                //read(tube_G_FP[0],&var,sizeof(int));
            }
            else{
                printf("Je rentre ici\n");
                close(tube_G_FP[1]);
                read(tube_G_FP[0],&var,sizeof(int));
                printf("Var = %d\n",var);
                if(var<id[0][m]){
                    close(tube_G_FP[0]);
                    write(tube_G_FP[1],&var,sizeof(int));
                    printf("Var gagne et l'envoie au pere: %d \n",var);
                    creerArbreGauche(n,m-1);
                    //close(tube_G_FP[1]);
                }
                else{
                    close(tube_G_FP[0]);
                    write(tube_G_FP[1],&id[0][m],sizeof(int));
                    printf("id[0][%d] gagne et envoie au pere son id : %d \n",m,id[0][m]);
                    creerArbreGauche(n,m-1);
                }
            }        
            exit(0);
        }
        wait(NULL);
    }
    else{
        return 0;
    }
}

【问题讨论】:

  • “管道有很多问题” .. 什么样的问题?

标签: c process tree


【解决方案1】:

这显然是错误的:

            close(tube_G_FP[1]); // we close tube_G_FP[1]
            read(tube_G_FP[0],&var,sizeof(int));
            printf("Var = %d\n",var);
            if(var<id[0][m]){
                close(tube_G_FP[0]);
                write(tube_G_FP[1],&var,sizeof(int)); // we write to tube_G_FP[1]

【讨论】:

    【解决方案2】:

    我找到了一个解决方案,并在一个函数中实现了它:

    //some of these variables can be declared in the main function
    int var;
    int var2;
    int **id; //tableau d'id
    int count;
    
    int creerArbreGauche(int n,int m,int** tab_tube_G,int** tab_tube_D)
    {
        printf("m : %d\n",m);
        if(m>0){
            if(fork()==0){
                if(m==(n-1)) //si on est au dernier proc
                {   
                    printf("Premiere condition, processus : [%d][%d] avec id : %d \n",count,m,id[count][m]);
                    write(tab_tube_G[m][1],&id[count ][m],sizeof(int));
                    creerArbreGauche(n,m-1,tab_tube_G,tab_tube_D);
                }
                else{
                    printf("Je rentre ici\n");
                    read(tab_tube_G[m+1][0],&var,sizeof(int));
                    printf("Var = %d\n",var);
                    if(var<id[count][m]){
                        write(tab_tube_G[m][1],&var,sizeof(int));
                        printf("Var gagne et l'envoie au pere: %d \n",var);
                        creerArbreGauche(n,m-1,tab_tube_G,tab_tube_D);
                    }
                    else{
                        write(tab_tube_G[m][1],&id[count][m],sizeof(int));
                        printf("id[%d][%d] gagne et envoie au pere son id : %d \n", count, m, id[count][m]);
                        creerArbreGauche(n,m-1,tab_tube_G,tab_tube_D);
                    }
                }        
                exit(0);
            }
            wait(NULL);
        }
    
        else{ 
            if(n==1){
                if(fork()==0){
                    write(tab_tube_D[count][1],&id[count][m],sizeof(int));
                    printf("on est au processus [%d] [%d]\n",count,m);
                    exit(0);
                }
                wait(NULL);
            }
            else{ //on est dans le vrai pere
                printf("On est dans le pere des peres\n");
                read(tab_tube_G[m+1][0],&var,sizeof(int));
                close(tab_tube_D[count+1][1]);
                read(tab_tube_D[count+1][0],&var2,sizeof(int));
                printf("id processus [%d][0] : %d \n",(count+1),var2);
                printf("VarFinal = %d\n",var);
                printf("id du padré %d\n",id[count][m]);
                if((var<=id[count][m])&&(var<=var2)){
                    printf("Var a gagné : %d \n",var);
                    write(tab_tube_D[count][1],&var,sizeof(int));
                    return var;
                }
                else if((var2<=id[count][m])&&(var2<=var)){
                    printf("Var2 a gagné : %d \n",var2);
                    write(tab_tube_D[count][1],&var2,sizeof(int));
                    return var2;
                }
                else{
                    printf("id[%d][%d] (Racine) gagne : %d \n", count, m, id[count][m]);
                    write(tab_tube_D[count][1],&id[count][m],sizeof(int));
                    return id[count][0];
                }
            }
        }
        printf("\n");
    }
    
    int main(){
        srand(time(NULL));
        int n=4, m=n-1;
        int i,j;
        int res;
    
        //GENERATION DES IDs
        id = (int**)malloc(n*sizeof(int*)); //tableau 2D de n ligne id
        for(i=0;i<n;i++){
            id[i] = (int*)malloc((n-1)*sizeof(int));
        }
        for(i=0;i<n;i++){
            for(j=0;j<(n-i);j++){
                id[i][j] = rand()%(n*n);
                printf("ceci est l'id : [%d][%d] = %d \n",i,j,id[i][j]);
            }
        }
    
        //GENERATION DE MES TUBES GAUCHE
        int** tab_tube_G =(int**)malloc(n*sizeof(int));
        for(int i=0;i<n;i++){
            tab_tube_G[i] =(int*)malloc(2*sizeof(int));
            pipe(&tab_tube_G[i][0]);
        }
    
        //GENERATION DE TUBES DROIT
        int** tab_tube_D =(int**)malloc(n*sizeof(int));
        for(int i=0;i<n;i++){
            tab_tube_D[i] =(int*)malloc(2*sizeof(int));
            pipe(&tab_tube_D[i][0]);
        }
    
        count = n-1;
        //GENERATION COMPLETE DE TOUT MON ARBRE
       for(i=1; i<=n; i++){
            m=i-1;
            printf(" i =  %d \t\n",i);
            res = creerArbreGauche(i, m, tab_tube_G, tab_tube_D);
            count--;
       }
       printf("res : %d\n",res);
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-12
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 2021-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多