C 进程树(fork)Linux

C 进程树(fork)Linux,c,process,tree,C,Process,Tree,我需要在linux中使用fork()创建一个进程树。 这棵树一定是这样的: 此外,每个进程都有一个随机ID。因此,在每个进程中,我们必须比较他的ID和他的子ID,并保持最小ID 所以,我试着用递归函数处理树的左侧部分,但它不起作用。。。(许多管道问题…) 对不起,我的英语不好,因为我是法国人 int-creerarbegauche(int-n,int-m) { 如果(m>0){ 如果(fork()==0){ printf(“pid:%d m:%d\n”,getpid(),m); if(m==(

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

此外,每个进程都有一个随机ID。因此,在每个进程中,我们必须比较他的ID和他的子ID,并保持最小ID

所以,我试着用递归函数处理树的左侧部分,但它不起作用。。。(许多管道问题…)

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

int-creerarbegauche(int-n,int-m)
{
如果(m>0){
如果(fork()==0){
printf(“pid:%d m:%d\n”,getpid(),m);
if(m==(n-1))//si在est au dernier proc上
{   
printf(“首要条件%d\n”,id[0][m]);
关闭(tube_G_FP[0]);
写入(tube_G_FP[1],&id[0][m],sizeof(int));
克里拉·布雷戈什(n,m-1);
//读取(tube_G_FP[0],&var,sizeof(int));
}
否则{
printf(“Je rentre ici\n”);
关闭(tube_G_FP[1]);
读取(tube_G_FP[0],&var,sizeof(int));
printf(“Var=%d\n”,Var);
如果(var这显然是错误的:

            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]
close(tube_G_FP[1])//我们关闭tube_G_FP[1]
读取(tube_G_FP[0],&var,sizeof(int));
printf(“Var=%d\n”,Var);

如果(var我找到了一个解决方案,并在单个函数中实现了这一点,那么它就是:

//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;
}
//其中一些变量可以在主函数中声明
int-var;
int-var2;
int**id;//tableau d'id
整数计数;
内筒子架(内n、内m、内**tab\u tube\u G、内**tab\u tube\u D)
{
printf(“m:%d\n”,m);
如果(m>0){
如果(fork()==0){
if(m==(n-1))//si在est au dernier proc上
{   
printf(“首要条件,进程:[%d][%d]avec id:%d\n”,计数,m,id[count][m]);
写入(tab_tube_G[m][1],&id[count][m],sizeof(int));
筒子架(n,m-1,塔布管G,塔布管D);
}
否则{
printf(“Je rentre ici\n”);
读取(tab_tube_G[m+1][0],&var,sizeof(int));
printf(“Var=%d\n”,Var);
if(var)“管道存在许多问题”。什么样的问题?
//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;
}