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.