C 进程树(fork)Linux
我需要在linux中使用fork()创建一个进程树。 这棵树一定是这样的: 此外,每个进程都有一个随机ID。因此,在每个进程中,我们必须比较他的ID和他的子ID,并保持最小ID 所以,我试着用递归函数处理树的左侧部分,但它不起作用。。。(许多管道问题…) 对不起,我的英语不好,因为我是法国人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==(
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;
}