Дерево процессов (вилка) Linux - PullRequest
0 голосов
/ 26 марта 2020

Мне нужно создать дерево процессов, используя fork () в linux. Дерево должно быть таким:

Tree

Более того, каждый процесс имеет случайный идентификатор. Таким образом, в каждом процессе мы должны сравнивать его идентификатор и идентификатор (ы) его сына (ов) и сохранять минимальный идентификатор.

Итак, я попытался сделать левую часть дерева с рекурсивной функцией но это не работает ... (много проблем с трубами ...)

(извините, мой Engli sh плох, потому что я француз :()

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;
    }
}

Ответы [ 2 ]

0 голосов
/ 27 марта 2020

Благодарю вас за помощь, я нашел решение и сделал это с помощью одной функции:

//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;
}
0 голосов
/ 26 марта 2020

Это явно неправильно:

            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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...