Fork

From Tuxunix
Jump to: navigation, search

Exemple d'exécution


$ echo $$
755
$ ./forkEx
Pere : PID=812, PPID=755, PID FILS=813
Fils : PID=813, PPID=812
$
   1./*
   2. *
   3. *Fork exemple
   4. *
   5.*/
   6.       
   7.#include <stdlib.h>
   8.#include <stdio.h>
   9.#include <unistd.h>
  10.#include <errno.h>
  11.#include <sys/wait.h>
  12.      
  13.int main(void) {
  14.    
  15.    pid_t pid;
  16./*if kernel load too much then wait*/
  17.    while ((pid == -1) && (errno == EAGAIN)); {
  18.        pid = fork();
  19.    }
  20./*if -1 then error*/
  21.    if (pid == -1) {
  22.        fprintf(stderr,"fork () impossible, errno=%d\n", errno);
  23.    }
  24./*INFO PID FILS*/
  25.    if (pid == 0) {
  26.        fprintf(stdout, "Fils : PID=%ld, PPID=%ld\n", (long)getpid(), (long)getppid());
  27.        return 0;
  28.    } else { /*INFO PID PERE*/
  30.        fprintf(stdout,"Pere : PID=%ld, PPID=%ld, PID FILS=%ld\n",(long)getpid(), (long)getppid(), (long)pid);
  32.        wait(NULL);/*wait end fils execution*/
  33.        return 0;
  34.    }
  35.       
  36.} /*main*/
 
'''Explication''' :
-----------
Le père a appelé fork et il s'est dupliqué. Cela implique plusieurs choses:
 
* Un nouveau processus a été créé, il est considéré comme le fils du processus qui a appelé fork()
* Ce processus est une copie conforme de son père. D'ailleurs, la prochaine instruction a exécuter sera la meme pour les deux : la condition if.
* La fonction fork() ne retourne pas la meme chose pour les deux processus. Pour le fils, il retournera 0. Pour le père, il retournera le pid du fils (son numèro de processus).