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

Linux Discussion :

La commande fork()


Sujet :

Linux

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 2
    Points : 3
    Points
    3
    Par défaut La commande fork()
    Bonjour à tous,
    J'ai un problème avec la commande fork(), j'espère que je post sur le bon forum parce que je voyais pas trop ou le mettre...

    Après avoir regardé plusieurs cours sur internet au sujet de la commande fork, j'ai cru comprendre que lorsqu'on appel cette commande, l'intégralité du code source est recopié dans le processus fils

    Au niveau du code ca donne ca:
    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
     
    	pid = fork();
    	if (pid < 0) { /* error occurred */
    		...
    		exit(-1);
    	}
    	else if (pid == 0) { /* child process */
    		...
    	}
    	else { /* parent process */
    		/* parent will wait for the child to complete */
    		wait(NULL);
    		printf("Child Complete");
    		exit(0);
    	}
    Mais je n'arrive pas bien à comprendre comment ca se passe, est ce que le processus fils est exécuté en premier puis le processus père ?
    est ce que les 2 sont exécutés en alternance ?

    Et ce que je n'arrive pas à comprendre aussi, c'est la chose suivante :
    si le code est recopié en intégralité, si je fait un banal printf("Bonjour"); avant le fork, sera-t-il exécuté dans le processus fils ?

    Merci

  2. #2
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    je vais tenter de t'expliquer mais le mieux étant que tu fasse des test par toi même.
    Donc imaginons le code suivant:
    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
     
    #include <stdio.h>
    #include <unistd.h>
     
    int main(int argc, char* argv[])
    {
    pid_t pid;
    printf("Coucou \n "); /*(1)*/
    pid = fork();  /*(2)*/
    	if (pid < 0) { /* error occurred */
    		exit(-1);
    	}
    	else if (pid == 0) { /* child process */
     
    	}
    	else { /* parent process */
    		/* parent will wait for the child to complete */
    		wait(NULL);
    		printf("Child Complete \n");
    		exit(0);
    	}
    }
    Tu compile et tu lance.

    Jusqua la ligne (1), tu n'a qu'un processus dont les instructions sont exécuté séquentiellement. Ensuite à la ligne 2, fork va créer un 2eme processus identique au premier. Cela signifie que dans le 2eme processus (et même dans le 1er), la prochaine instruction exécutée sera celle sui suit le fork ! Donc dans ce cas, ton second processus commence a l'affectation de la variable pid.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par javalearn Voir le message
    Après avoir regardé plusieurs cours sur internet au sujet de la commande fork, j'ai cru comprendre que lorsqu'on appel cette commande, l'intégralité du code source est recopié dans le processus fils
    Exact mais le fils ne commence son exécution qu'à l'endroit où le fork a lieu.

    Citation Envoyé par javalearn Voir le message
    Mais je n'arrive pas bien à comprendre comment ca se passe, est ce que le processus fils est exécuté en premier puis le processus père ?
    est ce que les 2 sont exécutés en alternance ?
    En fait, l'ordonanceur affecte un quantum d'exécution au procesuss 1, puis un quantum au processus 2 puis un quantum à un autre processus (parce qu'il n'y a pas que tes deux processus dans Unix) puis encore un autre etc puis revient au processus 1 puis au etc.
    Donc techniquement, chaque processus quand il s'exécute s'exécute tout seul mais, tout comme au cinéma, ça va tellement vite que t'as l'impression que tous les processus tournent en même temps.

    Citation Envoyé par javalearn Voir le message
    Et ce que je n'arrive pas à comprendre aussi, c'est la chose suivante :
    si le code est recopié en intégralité, si je fait un banal printf("Bonjour"); avant le fork, sera-t-il exécuté dans le processus fils ?
    Non. Faut le mettre après...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Merci Davidbrcz pour ton exemple, et Sve@r pour tes réponses, à vos 2 posts j'ai parfaitement compris, je pense que désormais j'ai plus qu'a m'exercer
    Merci beaucoup.

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

Discussions similaires

  1. [Fork] Exécuter des commandes en parallèle
    Par Arnaud F. dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 04/01/2010, 19h47
  2. Commandes externes en paralleles - Fork()
    Par yann4775 dans le forum Langage
    Réponses: 0
    Dernier message: 08/05/2009, 02h37
  3. Réponses: 5
    Dernier message: 13/12/2005, 14h48
  4. Réponses: 3
    Dernier message: 02/09/2002, 18h49
  5. Pas de fork sous Windows?
    Par chezjm dans le forum POSIX
    Réponses: 8
    Dernier message: 11/06/2002, 12h15

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