Comment implémenter des tuyaux pour plusieurs processus?

Je crée plusieurs processus et je dois créer deux canaux sans nom pour chaque processus.

Pour chaque enfant, un tube sera utilisé pour obtenir la valeur int du parent; un pour envoyer à des tableaux int à un parent. Parent fera certaines choses tout en obtenant de nouvelles données des enfants.

Le code de base:

#include  #include  #include  #include  #include  #include  // for reaching unix operations int main(int argc, char *argv[]){ pid_t main = getpid(); int N = 30; int i; pid_t* children = (pid_t*) malloc(sizeof(pid_t) * N); for(i = 0; i < N; i++){ pid_t child = fork(); if ( child == 0){ pid_t me = getpid(); printf("I'm a child and my pid is: %d\n", me); sleep(1); // exit(4); return me * 2; } else if ( child < 0){ // printf("Could not create child\n"); } else { children[i] = child; // printf("I have created a child and its pid %d\n", child); } } // The child never reaches here for(i = 0; i < N; i++){ int status; waitpid(children[i], &status, 0); printf("Process %d exited with return code %d\n", children[i], WEXITSTATUS(status)); } return 0; } 

J’ai essayé beaucoup de choses sans succès et je suis perdu. Pouvez-vous m’aider à continuer?

Toute aide est appréciée! Je vous remercie.

Voici comment configurer un canal pour chaque processus enfant afin que chaque enfant écrive sur le parent:

Comme vous avez besoin de deux descripteurs de fichiers pour chaque enfant, déclarez:

 int fd[2 * N]; 

Initialisez-les correctement:

 for (int i = 0; i < N; i++) { pipe(&fd[2*i]); } 

Dans le i ème processus enfant, utilisez:

 write(fd[2*i + 1], write_buffer, SIZE) 

pour écrire au parent et utiliser dans le parent:

  read(fd[2*i], read_buffer, SIZE) 

lire depuis le ieme enfant.


Pour fermer les tuyaux:

Dans le i ème enfant, vous pouvez utiliser

 close(fd[2*i]) 

tout de suite, vu que vous écrivez seulement. Après avoir terminé d'écrire l'appel

 close(fd[2*i + 1]) 

fermer l'extrémité écriture du tuyau.

La situation est parallèle chez le parent: lors de la lecture du i ème enfant, vous pouvez

 close(fd[2*i + 1]) 

tout de suite, puisque vous n'écrivez pas, et après avoir lu l'appel

 close(fd[2*i]) 

fermer l'extrémité de lecture du tuyau.


Comme vous avez besoin de deux canaux par processus enfant, créez deux tableaux - un contenant des canaux pour les enfants écrivant au parent et un contenant des canaux pour le parent qui écrit aux enfants.