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 :

probléme avec fork()


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Août 2007
    Messages
    260
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 260
    Points : 43
    Points
    43
    Par défaut probléme avec fork()
    salut les amis
    j'ai un probléme à comprendre le fonctionnement de la fonction fork
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    pid = fork ();
     
        if (pid > 0) {
             /* Processus père      */
        } else if (pid == 0) {
             /* Processus fils      */
        } else {
             /* Traitement d'erreur */
        }
    je veux savoir dans quel cas le pid sera égal à 0 ou différent de 0 ? c'est aleatoire ?
    la valeure retourné par fork a un rapport avec le PID (du getpid ou getppid )?

    et puisque il y aura la creation de 2 prossesus en meme temps par frok un avec un pid <> de 0 (père) et l'autre avec 0 (fils) ... on va executer le if et le else en meme temps ... c'est faux ça ?

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par yous18 Voir le message
    je veux savoir dans quel cas le pid sera égal à 0 ou différent de 0 ? c'est aleatoire ?
    Ben non tu viens de le dire.. dans un cas c'est le pere, dans l'autre le fils...

    Citation Envoyé par yous18 Voir le message
    la valeure retourné par fork a un rapport avec le PID (du getpid ou getppid )?
    Ben oui, c'est la meme chose "Process Identifier"


    Citation Envoyé par yous18 Voir le message
    et puisque il y aura la creation de 2 prossesus en meme temps par frok un avec un pid <> de 0 (père) et l'autre avec 0 (fils) ... on va executer le if et le else en meme temps ... c'est faux ça ?
    OUI c'est faux...

    Il n'y aura pas creation de 2 processus, mais d'un seul, le fils...
    Le pere existe deja.

    Le fork duplique le pere (et execute le meme code jusqu'au fork).

    Donc non on ne fera pas le if et le else en meme temps :on duplique le code, dans une instance, le pere, on passera d'un cote. Dans le fils de l'autre...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  3. #3
    Membre du Club
    Inscrit en
    Août 2007
    Messages
    260
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 260
    Points : 43
    Points
    43
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    OUI c'est faux...

    Il n'y aura pas creation de 2 processus, mais d'un seul, le fils...
    Le pere existe deja.

    Le fork duplique le pere (et execute le meme code jusqu'au fork).

    Donc non on ne fera pas le if et le else en meme temps :on duplique le code, dans une instance, le pere, on passera d'un cote. Dans le fils de l'autre...
    la j'ai pas bien compris tu peux encors m'expliquer ?
    le choix sera aléatoire entre fils et père ... c'est ça ?

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 165
    Points : 62
    Points
    62
    Par défaut
    le processus fils prends le pid 0 alors que le pere garde son pid

    dans ton code tu as un "if (pid == 0)" donc le fils entrera dans cette partie de code
    d'un autre cote le processus pere n'a pas son pid == 0 donc il entrera dans le else

    j'espere ne pas avoir dit d'anerie

  5. #5
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par yous18 Voir le message
    la j'ai pas bien compris tu peux encors m'expliquer ?
    le choix sera aléatoire entre fils et père ... c'est ça ?
    Qu'est ce que tu ne comprends pas dans "C'est faux" ??

    J'ai dit "non le choix n'est pas aléatoire, tu as donné toi-même la réponse".


    Citation Envoyé par m0ul3sh0t Voir le message
    le processus fils prends le pid 0 alors que le pere garde son pid

    dans ton code tu as un "if (pid == 0)" donc le fils entrera dans cette partie de code
    d'un autre cote le processus pere n'a pas son pid == 0 donc il entrera dans le else

    j'espere ne pas avoir dit d'anerie
    Du tout, c'est bien ça..
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par yous18 Voir le message
    la j'ai pas bien compris tu peux encors m'expliquer ?
    le choix sera aléatoire entre fils et père ... c'est ça ?
    La seule chose qu'il faut impérativement se mettre en tête, c'est que dès que tu exécutes "fork()" tu obtiens instantanément un duplicata de ton processus en cours. Donc avant le fork tu as un procesus, au moment où l'instruction se termine tu en as 2 identiques qui continuent tous deux à exécuter la suite du code
    exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include <sys/types.h>
    #include <unistd.h>
     
    int main()
    {
        fork();
        printf("Hello (pid=%d)\n", getpid()));
    }
    => Tu compiles, tu exécutes, tu obtiens 2 fois "Hello" mais chaque affichage provient d'un processus différent (le pid n'est pas le même)

    Donc la seule façon de distinguer qui est le père de qui est dans le retour du fork()
    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <sys/types.h>
    #include <unistd.h>
     
    int main()
    {
        int pid;
     
        pid=fork();
        printf("Mon père: %d - Moi: %d - pid: %d\n", getppid(), getpid(), pid);
    }
    Tu devrais obtenir un truc de ce style
    Mon père: <valeurA> - Moi: <valeur B> - pid <valeur C>
    Mon père: <valeur B> - Moi: <valeur C> - pid 0
    C'est donc grace à la valeur de pid que t'arrives à savoir dans quel processus tu es et que tu peux affecter tel ou tel code à tel ou tel processus.
    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]

  7. #7
    Membre du Club
    Inscrit en
    Août 2007
    Messages
    260
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 260
    Points : 43
    Points
    43
    Par défaut
    merci le amis j'ai compri ... aprés la création si il y a un if pour le fils et un else pour le père ils seront tous les deux exécuter ...

    quand j'ai compilé le dernier code de Sve@r j'ai eu une erreure de compilation sous Dev C++
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      [Linker error] undefined reference to `fork' 
      [Linker error] undefined reference to `getppid' 
      ld returned 1 exit status
    alors quoi faire ?

  8. #8
    Membre du Club
    Inscrit en
    Août 2007
    Messages
    260
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 260
    Points : 43
    Points
    43
    Par défaut
    ah je crois que seulement sur linux que fork peut s'executer et pas sur windows

  9. #9
    Membre éclairé Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Points : 790
    Points
    790
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    Le fork duplique le pere (et execute le meme code jusqu'au fork).
    Tu me mets le doute là. Tu ne voulais pas dire exécute le même code à partir du fork ?

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    yous18 : En effet, fork() est une fonction POSIX uniquement.

    valefor : Si j'ai bien compris, certaines implémentations de fork() ré-exécutent tout ce qui s'est passé avant (ne me demande pas comment ça fait pour des fonctions qui ont eu des effets de bord).
    Mais normalement, fork() duplique le processus et son état complet, ne changeant que quelques petites choses comme l'id du processus et évidemment la valeur de retour de fork()...

    yous18 : Dans le code que tu as posté, le test du if sera fait pour les deux processus, mais comme le pid n'aura pas la même valeur, le if n'ira pas dans la même branche. Pour le père, le test sera vrai, tandis que pour le fils, le test sera faux et c'est le else if qui sera exécuté.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    valefor : Si j'ai bien compris, certaines implémentations de fork() ré-exécutent tout ce qui s'est passé avant (ne me demande pas comment ça fait pour des fonctions qui ont eu des effets de bord).
    Intéressant. Pour tester le truc j'ai essayer de créer un code ayant des effets de bord pour voir ce que ça donne...
    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
    #include <sys/types.h>
    #include <unistd.h>
    #include <stdio.h>
     
    int main()
    {
    	char nom[1024];
    	FILE *fp;
     
    	sprintf(nom, "/tmp/essai%d", getpid());
     
    	fp=fopen(nom, "a");
    	fprintf(fp, "essai %d\n", getpid());
    	fclose(fp);
     
    	fork();
    	printf("Fini (%d)\n", getpid());
    }
    J'espérais que si le fork redéroule tout ce qui s'est passé avant, j'aurais alors soit 2 fichiers dans "/tmp", soit un fichier avec 2 lignes. Rien de tout ça...
    [edit]
    ... jusqu'à ce que j'ai l'idée de mettre le fclose après le fork(). Niveau prog je ne sais pas comment est sensé se comporter ce code où un process ouvre un fichier qui est fermé ensuite par lui et par son fils mais au résultat j'ai eu 2 lignes dans le fichier...

    Citation Envoyé par Médinoc Voir le message
    Mais normalement, fork() duplique le processus et son état complet, ne changeant que quelques petites choses comme l'id du processus et évidemment la valeur de retour de fork()...
    En fait, sous Linux, fork() ne duplique même pas la mémoire sauf si un des processus la modifie (optimisation à donf)
    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]

  12. #12
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Pour la mémoire, oui ça optimise, le Copy On Write, c'est utile.

    Il faut bien compenser pour l'impossibilité d'avoir confirmation immédiate qu'une application arbitraire s'est bien lancée (on peut savoir qu'elle a foiré, mais pas qu'elle marche, à moins de se dire "si elle n'a pas foiré dans cinq secondes, c'est qu'elle marche")...

    fork() est très bien pour diviser une application et faire comme des "threads indépendants". Par contre, pour lancer une application étrangère, le CreateProcess() de Windows est bien plus pratique.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 28
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Intéressant. Pour tester le truc j'ai essayer de créer un code ayant des effets de bord pour voir ce que ça donne...
    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
    #include <sys/types.h>
    #include <unistd.h>
    #include <stdio.h>
     
    int main()
    {
    	char nom[1024];
    	FILE *fp;
     
    	sprintf(nom, "/tmp/essai%d", getpid());
     
    	fp=fopen(nom, "a");
    	fprintf(fp, "essai %d\n", getpid());
    	fclose(fp);
     
    	fork();
    	printf("Fini (%d)\n", getpid());
    }
    J'espérais que si le fork redéroule tout ce qui s'est passé avant, j'aurais alors soit 2 fichiers dans "/tmp", soit un fichier avec 2 lignes. Rien de tout ça...
    [edit]
    ... jusqu'à ce que j'ai l'idée de mettre le fclose après le fork(). Niveau prog je ne sais pas comment est sensé se comporter ce code où un process ouvre un fichier qui est fermé ensuite par lui et par son fils mais au résultat j'ai eu 2 lignes dans le fichier...


    En fait, sous Linux, fork() ne duplique même pas la mémoire sauf si un des processus la modifie (optimisation à donf)
    J'ai déjà eu affaire a ce genre de code et le comportement est très aléatoir et plusieurs scénarios sont possible. De tte facon le fichier est une ressource partagée donc l'accès doit etre protégé par un mutex ou une semaphore. et du coup celui qui a ouvert le premier ecrit et ferme, le deuxième ne pourras rentrer dans le fichier que si la semaphore est liberée.

  14. #14
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    valefor : Si j'ai bien compris, certaines implémentations de fork() ré-exécutent tout ce qui s'est passé avant (ne me demande pas comment ça fait pour des fonctions qui ont eu des effets de bord).
    Mais normalement, fork() duplique le processus et son état complet, ne changeant que quelques petites choses comme l'id du processus et évidemment la valeur de retour de fork()...
    ben oui.. Et c'est valable pour TOUTE implémentation de fork, c'est précisé dans la doc.

    T'as pas remarqué, quand on fait un client/serveur : le code contenu jusqu'à l'attente est rééxécuté par le clone quand il démarre.... (tu peux faire des inits, des lectures de fichiers de configs, etc.. etc..) ?

    (puisqu'on arrive au "if (pid == 0 ) else ...")
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  15. #15
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Euh...
    Mais s'il y avait un affichage dans le code avant le fork(), l'affichage sera refait ?
    Ou une modification de fichier (un comptage, par exemple) ?

    Je n'ai jamais constaté cela...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  16. #16
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Euh...
    Mais s'il y avait un affichage dans le code avant le fork(), l'affichage sera refait ?
    Ou une modification de fichier (un comptage, par exemple) ?

    Je n'ai jamais constaté cela...
    testes

    Mais comme en général quand on fait des clients/serveurs on met pas de print, on le voit pas, mais si tu te mets en debug, avec des print, tu verras bien....
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  17. #17
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Je n'ai plus rien d'unixoïde sous la main, hélas. Mais on avait des cours sous HP-UX et FreeBSD à l'ISTY, avec des codes simples:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int main(void)
    {
    	int pid;
    	printf("Avant\n");
    	pid = fork();
    	printf("Apres: %d\n", pid);
    	return 0;
    }
    Et dans aucun de mes souvenirs (qui je dois l'admettre, ont trois ans), le "Avant" n'était affiché deux fois...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  18. #18
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    ben comment expliquerais-tu le code du PO (post #1), dans ce cas ??
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  19. #19
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Je ne vois pas ce qu'il y a de particulier à expliquer dans cet extrait de code (il n'y a rien de visible avant le fork()).

    Comme explications sur fork() dans le code lui-même, je dirais ceci:
    Lors du fork(), (et en supposant que le fork() n'échoue pas), le processus est dupliqué, y compris son état et sa mémoire (enfin, dupliqué ou mis en Copy-On-Write), donc y compris l'état de ses variables et le fait que son compteur programme soit quelque part dans le code de fork() (bien que où exactement dans la fonction peut être changé par le système d'exploitation, pour différencier la valeur de retour. C'est un détail, mais le fait est que le processus fils commence "déjà dans fork()".
    Ensuite, fork() retourne pour chacun des deux processus, avec de chaque côté la valeur de retour appropriée (0 pour le fils, pid du fils pour le père).

    PS: Peux-tu poster un lien vers la doc en question ? Je ne trouve rien via Wikipedia ou l'Open Group...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  20. #20
    Provisoirement toléré
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Points : 495
    Points
    495
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    valefor : Si j'ai bien compris, certaines implémentations de fork() ré-exécutent tout ce qui s'est passé avant
    Heu... lesquelles?

Discussions similaires

  1. problème avec fork()
    Par Alays dans le forum C
    Réponses: 15
    Dernier message: 05/10/2012, 10h29
  2. problème avec fork()
    Par Boss38400 dans le forum Débuter
    Réponses: 4
    Dernier message: 20/04/2010, 22h04
  3. Problème avec les forks
    Par dot-_-net dans le forum C
    Réponses: 10
    Dernier message: 09/05/2008, 23h29
  4. problème avec fork et execvp !
    Par julien.cousineau dans le forum Linux
    Réponses: 0
    Dernier message: 07/10/2007, 23h38
  5. [Perl]problème avec fork
    Par LE NEINDRE dans le forum Programmation et administration système
    Réponses: 1
    Dernier message: 23/09/2005, 15h31

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