modifié le

Création de processus

fork

La fonction fork() crée un nouveau processus dans le système. Le processus obtenu est la copie conforme du processus qui l’a créé. Donc fork() duplique le processus courant.

Au retour du fork(), le processus intial et son clone sont dans le même état. En particulier, le point d’exécution est le même dans les 2 processus : c’est la même instruction dans chaque processus qui s’exécute après le retour de fork().

Une différence notable entre les 2 processus est la valeur renvoyée par fork(). Dans le nouveau processus, fork() renvoie 0, alors que dans le processus initial, fork() renvoie le PID du processus créé : le processus père récupère donc le PID de son fils. Exemple :

int main()
{
  pid_t pid ;
  int ret ;

  // ici, il y a 1 processus unique

  pid = fork() ; /* dédoublement : pid reçoit le PID du fils dans le père
                                   pid reçoit 0 dans le fils */
  // ici, il y en a 2

  switch(pid)
  {
    case -1 :
      perror("erreur de fork !\n") ;
      return 1 ;

   case 0 :
      puts("[fils] coucou c'est moi !") ;
      return 0  ;

   default :
      printf("[père] le PID de fiston est %d\n",pid) ;
      puts("[père] j'attends que fiston ait fini\n") ;
      wait(&ret) ;
      printf("[père] fiston a renvoyé %d\n",WEXITSTATUS(ret)) ;
      return 0 ;
  }
}

Normalement, le processus père doit attendre la fin d’exécution de tous ces fils (fonction wait) avant de se terminer. De cette façon, l’environnement du fils est libéré proprement, et les ressources sont restituées au système. Un processus terminé, dont le code de retour n’a pas été lu par son père, reste dans la liste des processus en tant que processus zombie. Un processus actif qui n’a plus de père est un processus orphelin.