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 :

probleme des processus fork()


Sujet :

Linux

  1. #1
    Membre à l'essai
    Femme Profil pro
    Collégien
    Inscrit en
    Novembre 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Collégien
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2013
    Messages : 29
    Points : 17
    Points
    17
    Par défaut probleme des processus fork()
    Bonjour,

    Exercice
    soit le programme C suivant
    fork(); if (fork()) fork;
    fork(); if (fork()) fork;

    Combien de processus sont crées à l'exécution du programme(on supposera qu'aucun appel n'échoue).?

    est ce que le résultat 36 ou bien plus de 100 ????

  2. #2
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 119
    Points
    28 119
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    fork();
     
    if (fork())
      fork;
     
    fork();
     
     if (fork()) 
      fork;
    C'est un problème d'algorithmique pure :
    Avant le premier appel, tu as 1 processus. Au premier appel, il en créé un autre, tu en as donc 2 ; à chaque appel de fork, tu en auras un de plus par appelant.
    Maintenant, on arrive au if (fork()), qui est extrèmement ma écrit, et proche de l'obfuscation de code (si ton prof me lit, c'est avec plaisir que je lui expliquerai pourquoi s'il le faut). Ca serait déjà un peu mieux avec : if (fork() != 0), et encore mieux avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    /* Attention, on suppose que fork() ne peut pas echouer, ce qui n'est pas le cas dans la vraie vie */
    pid = fork(); /* 1 : on duplique le processus */
    if (pid != 0)  /* etape 2 : test */
    {
      fork(); /* 3 : on duplique l'appelant */
    }
    /* pas de else */
    En 1, tu as maintenant 2 processus.
    Sauf que pid ne vaut pas la même chose pour le père et pour le fils : pid vaut 0 pour le fils, alors que le père se voit retourner le numéro de processus (que l'on appelle pid) du fils.
    Donc le code du if, c'est à dire l'étape 3, ne sera exécuté que par le père, qui va se dupliquer à son tour.
    A la fin de ces lignes, tu as donc 3 processus par appelant.

    Et comme tu avais 2 processus en arrivant à ce bout de code, tu en as 6 en tout.

    Ensuite, tous ces processus appellent fork, et se dupliquent. Donc 12. Et ainsi de suite... (non, je ne vais pas te donner la réponse).

    Si tu veux le visualiser, fais un schéma, avec des ronds pour chaque étape, et des flèches pour chaque processus.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  3. #3
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Bonjour,

    (non, je ne vais pas te donner la réponse)
    euh... oui mais c'est lui qui l'a donnée, ladite réponse. Non ?
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  4. #4
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 119
    Points
    28 119
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    euh... oui mais c'est lui qui l'a donnée, ladite réponse. Non ?
    Pour moi, lorsqu'on demande 36 ou plus de 100, c'est qu'on ne connait pas la réponse . Après, je ne sais pas si cette phrase fait partie de l'énoncé du problème ou bien si ce sont deux solutions de deux élèves différents, ou bien encore autre chose.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  5. #5
    Membre à l'essai
    Femme Profil pro
    Collégien
    Inscrit en
    Novembre 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Collégien
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2013
    Messages : 29
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par gangsoleil Voir le message
    Pour moi, lorsqu'on demande 36 ou plus de 100, c'est qu'on ne connait pas la réponse . Après, je ne sais pas si cette phrase fait partie de l'énoncé du problème ou bien si ce sont deux solutions de deux élèves différents, ou bien encore autre chose.
    c'est mon réponse

  6. #6
    Membre à l'essai
    Femme Profil pro
    Collégien
    Inscrit en
    Novembre 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Collégien
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2013
    Messages : 29
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par gangsoleil Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    fork();
     
    if (fork())
      fork;
     
    fork();
     
     if (fork()) 
      fork;
    C'est un problème d'algorithmique pure :
    Avant le premier appel, tu as 1 processus. Au premier appel, il en créé un autre, tu en as donc 2 ; à chaque appel de fork, tu en auras un de plus par appelant.
    Maintenant, on arrive au if (fork()), qui est extrèmement ma écrit, et proche de l'obfuscation de code (si ton prof me lit, c'est avec plaisir que je lui expliquerai pourquoi s'il le faut). Ca serait déjà un peu mieux avec : if (fork() != 0), et encore mieux avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    /* Attention, on suppose que fork() ne peut pas echouer, ce qui n'est pas le cas dans la vraie vie */
    pid = fork(); /* 1 : on duplique le processus */
    if (pid != 0)  /* etape 2 : test */
    {
      fork(); /* 3 : on duplique l'appelant */
    }
    /* pas de else */
    En 1, tu as maintenant 2 processus.
    Sauf que pid ne vaut pas la même chose pour le père et pour le fils : pid vaut 0 pour le fils, alors que le père se voit retourner le numéro de processus (que l'on appelle pid) du fils.
    Donc le code du if, c'est à dire l'étape 3, ne sera exécuté que par le père, qui va se dupliquer à son tour.
    A la fin de ces lignes, tu as donc 3 processus par appelant.

    Et comme tu avais 2 processus en arrivant à ce bout de code, tu en as 6 en tout.

    Ensuite, tous ces processus appellent fork, et se dupliquent. Donc 12. Et ainsi de suite... (non, je ne vais pas te donner la réponse).

    Si tu veux le visualiser, fais un schéma, avec des ronds pour chaque étape, et des flèches pour chaque processus.

    Si if(fork()==0) c.a.d il est bien crée le nombre 2*2*2*2*2*2=64

    Si if(fork()==0) c.a.d il n'est pas crée le nombre 2*2*3/2*2*2*3/2=36

    ???????

  7. #7
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 119
    Points
    28 119
    Par défaut
    Si if(fork()==0) c.a.d il est bien crée le nombre 2*2*2*2*2*2=64

    Si if(fork()==0) c.a.d il n'est pas crée le nombre 2*2*3/2*2*2*3/2=36
    Je ne comprends pas ce que tu veux dire...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    /* 1 processus ici */
    if ( fork() )  /* l'appel à fork() duplique le processus, donc on a 2 processus après exécution de cette ligne */
    {
      /* MAIS, sur les 2 processus existant, 1 seul, le père, exécute le code qui est dans ce bloc */ /* 2 processus en tout ici */
      fork(); /* le père est encore dupliqué, mais le fils n'exécute pas ce code, donc le fils n'est pas dupliqué */ /* 3 processus en tout ici */
    }    
    /* Donc 3 processus au final */
    Donc sur tout ton 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
    /* 1 processus */
    
    fork();
    /* 2 processus */
     
    if (fork()) 
      fork();
     
    /* 6 processus */
    
    fork();
    /* 12 processus */
     
     if (fork()) 
      fork;
    /* 36 processus */
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  8. #8
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Ha ben si, finalement, tu as donné la réponse.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  9. #9
    Membre à l'essai
    Femme Profil pro
    Collégien
    Inscrit en
    Novembre 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Collégien
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2013
    Messages : 29
    Points : 17
    Points
    17
    Par défaut
    Mon probleme pour qoui le 3eme fork() le père est encore dupliqué, mais le fils n'exécute pas ce code, donc le fils n'est pas dupliqué

    j'ai pas compris sa

  10. #10
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    0 est-il vrai ou faux, selon toi?
    1268 est-il vrai ou faux, selon toi?
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  11. #11
    Membre à l'essai
    Femme Profil pro
    Collégien
    Inscrit en
    Novembre 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Collégien
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2013
    Messages : 29
    Points : 17
    Points
    17
    Par défaut
    o c.a.d vrai est le fils bien cree

  12. #12
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    0 et 1286 ont une vérité logique opposée. Donc en sortie de ton "if", seule la moitié des processus donneront un nouveau fils.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

Discussions similaires

  1. [SDL 1.2] Dessiner des images SDL dans des processus fork()
    Par DiR95 dans le forum SDL
    Réponses: 5
    Dernier message: 27/03/2015, 11h33
  2. probleme des processus fork()
    Par nadine01 dans le forum C
    Réponses: 5
    Dernier message: 19/01/2015, 09h23
  3. Réponses: 2
    Dernier message: 29/03/2007, 17h43
  4. Probleme processus Fork PERL
    Par djezair31 dans le forum Langage
    Réponses: 3
    Dernier message: 02/10/2006, 16h00
  5. Probleme de boucle avec des processus sous UNIX
    Par sebastieng dans le forum POSIX
    Réponses: 6
    Dernier message: 15/10/2005, 18h57

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