IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Besoin d'éclairage sur fork()


Sujet :

C

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 62
    Points : 36
    Points
    36
    Par défaut Besoin d'éclairage sur fork()
    Salut,

    J'aimerais avoir quelques précisions sur la fonction fork(), en effet je comprends pas pourquoi ce code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    #include <errno.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
     
    #include <sys/wait.h>
     
    int main(void){
    	pid_t pid_fils;
    	int	i;
    	do{
    		pid_fils = fork();
    	}while((pid_fils == -1) && (errno == EAGAIN));
     
    	for(i = 0; i < 2; i++){
    		if(pid_fils == - 1){
    			fprintf(stderr, "fork() impossible, errno=%d\n", errno);
    			return 1;
    		}
    		printf("Fils %d crée\n", i);
    	}
     
    	if(pid_fils == 0){	//Processus fils
    		fprintf(stdout, "Fils : PID=%ld, PPID=%ld\n", (long)getpid(), (long)getppid());
     
    		return 0;
    	}
    	else{
    		fprintf(stdout, "Pere : PID=%ld, PPID=%ld, PID fils=%ld\n", (long)getpid(), (long)getppid(), (long)pid_fils);
    		wait(NULL);
    		return 0;
    	}
    }
    m'affiche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Fils 0 crée
    Fils 1 crée
    Pere : PID=5342, PPID=3503, PID fils=5343
    Fils 0 crée
    Fils 1 crée
    Fils : PID=5343, PPID=5342
    et non pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Fils 0 crée
    Fils 1 crée
    Pere : PID=5342, PPID=3503, PID fils=5343
    Fils : PID=5343, PPID=5342
    Fils : PID=5344, PPID=5342

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    fork() ne créé qu'un seul processus fils.

    fork() renvois 0 si on est dans le processus fils et le pid du fils si on est dans le processus du père. Donc à moins que tu ais une erreur lors du fork, tu n'auras que deux processus : le père et le fils.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    //code exécuté par le processus père ET le processus fils
    	for(i = 0; i < 2; i++){ //deux itérations
    		if(pid_fils == - 1){
    			fprintf(stderr, "fork() impossible, errno=%d\n", errno);
    			return 1;
    		}
    		printf("Fils %d crée\n", i); // 2 * 2 = 4 affichage (exécuté par le processus fils ET le processus père
    	}
     
    	if(pid_fils == 0){	//Processus fils
    		fprintf(stdout, "Fils : PID=%ld, PPID=%ld\n", (long)getpid(), (long)getppid());
     
    		return 0;
    	}
    	else{
    		fprintf(stdout, "Pere : PID=%ld, PPID=%ld, PID fils=%ld\n", (long)getpid(), (long)getppid(), (long)pid_fils);
    		wait(NULL);
    		return 0;
    	}

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 62
    Points : 36
    Points
    36
    Par défaut
    Compris !
    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 30/08/2011, 16h00
  2. neophyte besoin d'éclairage sur les visual basic ?
    Par tibofo dans le forum Visual Studio
    Réponses: 4
    Dernier message: 26/06/2009, 12h56
  3. Réponses: 3
    Dernier message: 19/06/2008, 19h39
  4. Besoin d'éclairage sur une applet
    Par cassboul dans le forum Applets
    Réponses: 4
    Dernier message: 01/08/2006, 18h33
  5. [CR] besoin d'aide sur les formules
    Par GuillaumeDSA dans le forum Formules
    Réponses: 4
    Dernier message: 10/07/2003, 12h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo