Création de processus avec fork();

Portrait de trax

La fonction fork permet la duplication de processus. A l'issu de son appel il existera donc deux processus : le père et le fils. Il ne seront différencié que par le retour de la fonction fork et leur valeur de PID (processor Identifiant)

fork() renvoie

  • -1 en cas d'erreur
  • 0 pour le fils
  • >0 pour le fils : le nombre renvoyé est le pid du fils (qui ne peut pas être 0 puisque 0 est le pid du noyau)
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h> //fork
  4.  
  5. #include <sys/wait.h> //wait
  6. int main(){
  7. int partage = 42;
  8. int pid;
  9. switch(pid = fork()){
  10. case -1:
  11. fprintf(stderr, "Avortement\n");
  12. exit(EXIT_FAILURE);
  13.  
  14. case 0:
  15. printf("f>Je suis le fils, mon pid est %d\n",getpid());
  16. printf("f>Le pid de mon pere est : %d\n",getppid());
  17. printf("f>Je partage avec mon pere la variable partage == %d\n", partage);
  18. break;
  19.  
  20. default:
  21. printf("p>Je suis le pere. Mon pid est : %d\n",getpid());
  22. printf("p>Le pid de mon fils est : %d\n",pid);
  23. printf("p>Je partage avec mon fils la variable partage == %d\n", partage);
  24.  
  25. wait(NULL); // permet d'attendre la mort du fils
  26. }
  27. return 0;
  28. }

Le code dans les "case 0" et default sont exécuté en parallèle. Les lignes peuvent donc être entrelacées.

Un processus fils dont le père est mort renverra 1 (le pid d'init) comme ppid. Pour éviter cela nous utilison la fonction wait (ligne 25) qui fera est bloquant jusqu'au changement de status d'un fils du processus. En l'occurence nous attendons la mort du processus fils, pour que ce dernier ait le temps de demander le pid de son père.