Passer la valeur du processus enfant au processus parent

J’ai ce code qui est censé créer trois processus enfants et chacun effectuera une petite opération mathématique. Ensuite, le parent est supposé utiliser les résultats de tout le processus enfant et obtenir une réponse finale, mais je ne trouve pas le moyen de lire le résultat de l’enfant dans le parent. Y a-t-il un moyen de faire cela?

#include  #include  #include  int main(void) { int pid1, pid2, pid3, status; int a=1, b=2, c=5, d=4, e=6, f=3, g; int t1, t2, t3; printf("Hello World!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"); printf("Here I am before use of forking\n"); printf("I am the PARENT process and pid is : %d\n",getpid()); pid1 = fork( ); if (pid1 == 0) { printf("\n\nHere I am just after child forking1\n"); printf("I am the Child process and pid1 is :%d\n",getpid()); printf("My parent's pid is :%d\n",getppid()); t1 = a+b; printf("The answer for t1 is: %d\n", t1); exit(0); } else { wait(&status); printf("\nHere I am just after parent forking1\n"); printf("I am the Parent process and pid is: %d\n",getpid()); } pid2 = fork( ); if (pid2 == 0) { printf("\n\nHere I am just after child forking2\n"); printf("I am the Child process and pid2 is :%d\n",getpid()); printf("My parent's pid is :%d\n",getppid()); t2 = c+d; printf("The answer for t2 is: %d\n", t2); exit(0); } else { wait(&status); printf("\nHere I am just after parent forking2\n"); printf("I am the Parent process and pid is: %d\n",getpid()); } pid3 = fork( ); if (pid3 == 0) { printf("\n\nHere I am just after child forking3\n"); printf("I am the Child process and pid3 is :%d\n",getpid()); printf("My parent's pid is :%d\n",getppid()); t3 = e/f; printf("The answer for t3 is: %d\n", t3); exit(0); } else { wait(&status); printf("\nHere I am just after parent forkingALL\n"); printf("I am the Parent process and pid is: %d\n",getpid()); } printf("\n\nThe final answer for t1 is: %d\n", t1); printf("The final answer for t2 is: %d\n", t2); printf("The final answer for t3 is: %d\n", t3); g = t1*t2-t3; printf("The final answer for g is: %d\n", g); } 

Vous pouvez le faire avec une technique très simple, la mémoire partagée . Je vais donner un exemple complet de la façon dont cela fonctionne.

Premièrement, supposons que je veuille écrire un programme pour imprimer les n premiers termes de la série de Fibonacci (et je sais que ce n’est pas si logique de le faire, mais c’est un exemple simple pour que tout le monde puisse le comprendre).

  1. J’ai un parent qui lit une valeur entière représentant les n premiers termes
  2. Ensuite, le processus parent créera un enfant et lui passera n
  3. Ensuite, l’enfant doit calculer les n premiers termes et les restituer au parent.

 #include  #include  #include  #include  #include  void printFibo(int n, int *fibo) { int i; for(i=0; i<=n; i++) printf("%d -> %d\n" ,i, fibo[i]); } void computeFibo(int n, int *fibo) { int i; fibo[0] = 0; fibo[1] = 1; for (i=2; i<=n; i++) fibo[i] = fibo[i-1] + fibo[i-2]; } int main(int argc, char *argv[]) { pid_t childPID; int status; int shm_fd; int* shared_memory; int msize; // the size (in bytes) of the shared memory segment const char *name = "FIBONACCI_SERIES"; int n; if (argc!=2) { fprintf(stderr, "usage: %s \n", argv[0]); return -1; } n = atoi(argv[1]); if (n < 0) { fprintf(stderr, "Illegal fibonacci number: %s\n", argv[1]); return -2; } // calculating the array size based on the number of terms being passed from child to parent msize = (n+2)*sizeof(int); // open the memory shm_fd = shm_open (name, O_CREAT | O_EXCL | O_RDWR, S_IRWXU | S_IRWXG); if (shm_fd < 0) { fprintf(stderr,"Error in shm_open()"); return -3; } printf("Created shared memory object %s\n", name); // attach the shared memory segment ftruncate(shm_fd, msize); printf("shmat returned\n"); // allocating the shared memory shared_memory = (int *) mmap(NULL, msize, PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0); if (shared_memory == NULL) { fprintf(stderr,"Error in mmap()"); return -3; } printf("Shared memory segment allocated correctly (%d bytes).\n", msize); shared_memory[0] = n; childPID=fork(); if ( childPID == -1 ) { fprintf(stderr, "Cannot proceed. fork() error"); return -4; } if (childPID == 0) { // then we're the child process computeFibo(shared_memory[0],shared_memory+1); exit(0); } else { // parent will wait until the child finished wait(&status); // print the final results in the printFibo(shared_memory[0], shared_memory+1); // now detach the shared memory segment shm_unlink(name); } return 0; } 

Si vous voulez le faire sans utiliser aucun moyen de communication, c.-à-d. Canaux, mémoire partagée, vous devrez utiliser l’appel système exit() . L’appel système de exit renvoie un signal qui est ensuite intercepté par l’appel système wait() dans le processus parent. Ici, je vous donne un code dans lequel j’envoie une valeur d’enfant à parent. Une dernière chose que vous devez diviser le signal capturé par attendre par 255 pour obtenir la valeur exacte. `

  #include #include #include #include #include int main(int argc,char *argv[]) { pid_t pid=fork(); if(pid==0) {//child int sum=5+7; exit(sum);//sending exiting status or any value to parent } else {//parent int childval=-1; wait(&childval);//catching signal sent by exit of(child) printf("%d",childval/255);//changing signal to exact value } return 0; } 

`

fork crée une copie du processus. Ainsi, une fois que vous appelez fork les processus enfants disposent de leur propre copie des variables t1, t2 et t3 que vous vous attendez à lire du parent.

Donc, une fois que vous exit enfants, les enfants meurent avec les valeurs calculées qui leur sont locales.

Si vous voulez lire les valeurs des enfants, vous devez utiliser des pipes ou de la mémoire partagée.

Vous devez créer un canal dans le processus parent, puis après fork, vous devez fermer le descripteur de fichier d’entrée dans le processus enfant et le descripteur de fichier de sortie dans le processus parent.

Il y a un exemple tiré de la page de manuel pipe (2).

  #include  #include  #include  #include  #include  int main(int argc, char *argv[]) { int pipefd[2]; pid_t cpid; char buf; if (argc != 2) { fprintf(stderr, "Usage: %s \n", argv[0]); exit(EXIT_FAILURE); } if (pipe(pipefd) == -1) { perror("pipe"); exit(EXIT_FAILURE); } cpid = fork(); if (cpid == -1) { perror("fork"); exit(EXIT_FAILURE); } if (cpid == 0) { /* Child reads from pipe */ close(pipefd[1]); /* Close unused write end */ while (read(pipefd[0], &buf, 1) > 0) write(STDOUT_FILENO, &buf, 1); write(STDOUT_FILENO, "\n", 1); close(pipefd[0]); _exit(EXIT_SUCCESS); } else { /* Parent writes argv[1] to pipe */ close(pipefd[0]); /* Close unused read end */ write(pipefd[1], argv[1], strlen(argv[1])); close(pipefd[1]); /* Reader will see EOF */ wait(NULL); /* Wait for child */ exit(EXIT_SUCCESS); } }