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 :

Question sur les fork()


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Chercheur en informatique
    Inscrit en
    Février 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2019
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Question sur les fork()
    Bonjour une petite question sur les fork.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    int main()
    {
    int p1,p2,p3;
     
     p1=fork();
     p2=fork();
     if(p2==0)
        p3=fork();
     exit(0);
     
    }
    La condition du if n 'est jamais vraie ?
    ou je n ai pas compris les fork

    Merci

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 963
    Points
    32 963
    Billets dans le blog
    4
    Par défaut
    Le pid sera de 0 dans le processus fils forké.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Nouveau Candidat au Club
    Femme Profil pro
    Chercheur en informatique
    Inscrit en
    Février 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2019
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci pour la reponse il faut que je revois ca alors h

  4. #4
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 642
    Points
    7 642
    Par défaut
    Plus exactement, le pid sera de 0 dans les processus 'forkés'.

    Le père à un fils au moment du p1 = fork();.
    Le père et son fils ont chacun un petit-fils au moment du p2 = fork();.
    Et les deux petit-fils produits auront un fils au moment du p3 = fork();.
    D'où 6 processus dont seulement 2 auront p2 != 0.

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    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 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Pierre252019 Voir le message
    Merci pour la reponse il faut que je revois ca alors h
    Ca semble compliqué au premier abord mais en réalité ça reste simple (mais avec ton exemple où tu fais deux fork, forcément là ça complexifie vachement !!!)

    Ce qu'il faut bien comprendre dès le début, c'est que dès que tu appelles fork(), l'OS dédouble ton processus. Avant le fork() il n'y a qu'un processus, après le fork() il y en a deux. Et à partir de là, tout ce qui suit est alors exécuté par les deux.

    Exemple

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int main() {
    	printf("Avant\n");
    	fork();
    	printf("Après\n");
    }
    Si tu compiles et exécutes, tu auras une fois "Avant" et deux fois "Après" parce que ce second affichage aura été fait par deux processus (et que les deux écrivent à l'écran).

    Autre exemple
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int main() {
    	printf("Avant %d\n", getpid());
    	fork();
    	printf("Après %d\n", getpid());
    }
    Là tu auras une fois "Avant" avec un chiffre représentant le n° de processus en cours, et deux fois après avec l'un des deux ayant le même chiffre (c'est toujours le même processus) et l'autre ayant un chiffre différent (on peut estimer qu'il sera égal au premier incrémenté de 1) parce qu'il s'agit d'un nouveau processus généré par le fork(). On dit alors que le second est le "fils" du premier, qui, lui, est alors le "père" du second.

    L'intérêt de générer un autre processus toutefois de pouvoir lui faire faire des trucs en collaboration avec le premier et non des trucs identiques. Pour ce, il faut alors arriver à les distinguer l'un de l'autre.
    Ben cette distinction est faite dans le retour lui-même du fork(). Dans le processus fils ce retour vaut 0, et dans le père il vaut le n° du fils généré.
    Ainsi, en testant ce retour, on peut alors distinguer les deux cas
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int main() {
    	int p;
    	printf("Avant %d\n", getpid);
    	if ((p=fork()) == 0)
    		printf("Je suis le fils %d\n", getpid());
    	else
    		printf("Je suis le père %d de %d\n", p, getpid());
    }

    Attention, ce n'est pas parce qu'on a testé les deux cas qu'il faut oublier que tout ce qui suit reste soumis au doublon.
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int main() {
    	int p;
    	printf("Avant %d\n", getpid);
    	if ((p=fork()) == 0)
    		printf("Je suis le fils %d\n", getpid());
    	else
    		printf("Je suis le père %d de %d\n", p, getpid());
    	printf("Après %d\n", getpid());
    }
    Dans ce 4° exemple, le "Après" sera affiché par les deux processus qui continuent à exister et ce, jusqu'à la fin du programme ou bien jusqu'à la mort demandée (et vaut mieux la demander dans le fils car si c'est le père qui meurt ça devient assez bordelique à récupérer ensuite)

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int main() {
    	int p;
    	printf("Avant %d\n", getpid);
    	if ((p=fork()) == 0) {
    		printf("Je suis le fils %d\n", getpid());
    		exit(0);
    	}
    	printf("Je suis le père %d de %d\n", p, getpid());
    	printf("Après %d\n", getpid());
    }
    Donc ici, le fils demande à mourir dans la partie du code qui lui est propre. L'OS obéit à sa requête et l'arrête mais le père, lui, (qui n'a alors plus besoin de else) continue son travail jusqu'à la fin du programme.

    Toi, avec ton exemple, tu as un processus P1 qui génère un P2 avec le premier fork(). Ensuite, P1 génère P3 et P2 génère P4 (second fork() exécuté par P1 et P2). Et enfin P3 et P4 seuls (car dans le cas "fils" du second fork()) appellent le 3° fork() donc P3 génère P5 et P4 génère P6.
    Et si on fait l'arbre, alors
    P1_P2_P4_P6
    |__P3_P5

    Citation Envoyé par Pierre252019 Voir le message
    La condition du if n 'est jamais vraie ?
    Comme le chat de Schrödinger qui est à la fois vivant et mort, la condition est à la fois vraie et à la fois pas vraie.
    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]

  6. #6
    Membre régulier Avatar de ekieki
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Avril 2014
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Avril 2014
    Messages : 34
    Points : 103
    Points
    103
    Par défaut
    Il s'y ajoute des facéties liées à la présence de tampons

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    printf("a");
    fork();
    printf("b\n");

    Si la chaine "a" est restée dans le tampon d'écriture avant le fork(), comme le tampon est dédoublé lors du fork(), "ab" s'affichera deux fois. Chacun son tampon.

    Précaution : fflush(stdout); avant le fork().

    Si la question est "est-ce que fork() retourne 0 ?", la réponse est une autre question : "retourne à qui ?".

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    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 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ekieki Voir le message
    Si la chaine "a" est restée dans le tampon d'écriture avant le fork(), comme le tampon est dédoublé lors du fork(), "ab" s'affichera deux fois. Chacun son tampon.
    Amusant. Je viens de tester...
    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]

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

Discussions similaires

  1. Petite question sur les performances de Postgres ...
    Par cb44 dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 13/01/2004, 13h49
  2. question sur les vertex buffer et index buffer
    Par airseb dans le forum DirectX
    Réponses: 9
    Dernier message: 25/08/2003, 02h38
  3. question sur les variables globales et les thread posix
    Par souris_sonic dans le forum POSIX
    Réponses: 5
    Dernier message: 13/06/2003, 13h59
  4. Question sur les handles et les couleurs...
    Par MrDuChnok dans le forum C++Builder
    Réponses: 7
    Dernier message: 29/10/2002, 08h45
  5. question sur les message box !
    Par krown dans le forum Langage
    Réponses: 7
    Dernier message: 02/08/2002, 16h11

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