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 :

Explication de code avec fork


Sujet :

C

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 84
    Points : 48
    Points
    48
    Par défaut Explication de code avec fork
    Bonjour,

    J'ai un code que j'arrive a compendre ce qu'il fait exactement mais pas comment il est executer et surtout l'ordre d'execution. Voila le 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
     
    int main (void)
    {pid_t fils;
    do
       {
    fils=fork();
        }while (fils==-1)&&(errno==EAGAIN);
    if (fils==-1)
    {  fprint stderr,"fork() impossible, errno=%d\n,errno); return 1;}
     
    if (fils==0) {fprint(stdout,"fils");}
    else {fprint(stdout,"pere");}
    .....
    }
    Les questions qui me casse la tete sont :

    1/ Quel est l'utilité de if (fils==-1) ?? car pour moi je vois qu'on aura jamais ce cas puisque la boule se charge de l'eleminer

    2/pour le pid comment est il censé changer car l'auteur de ce code affiche l'execution qui traite a la fois les deux cas c'est a dire a l'execution s'affiche

    fils (infos du fils)

    pere (infos du pere)

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 195
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 195
    Points : 17 163
    Points
    17 163
    Par défaut
    Bonjour,
    Voici deux extrait du man de fork, qui devrait t'aider:

    Citation Envoyé par man fork
    fork crée un processus fils qui diffère du processus parent uniquement par ses valeurs PID et PPID et par le fait que toutes les statistiques d'utilisation des ressources sont remises à zéro. Les verrouillages de fichiers, et les signaux en attente ne sont pas hérités.

    Sous Linux, fork est implementé en utilisant une méthode de copie à l'écriture. Ceci consiste à ne faire la véritable duplication d'une page mémoire que lorsqu'un processus en modifie une instance. Tant qu'aucun des deux processus n'écrit dans une page donnée, celle-ci n'est pas vraiment dupliquée. Ainsi les seules pénalisations induites par fork sont le temps et la mémoire nécessaires à la copie de la table des pages du parent ainsi que la création d'une structure de tâche pour le fils.
    Citation Envoyé par man fork
    En cas de succès, le PID du fils est renvoyé au processus parent, et 0 est renvoyé au processus fils. En cas d'échec -1 est renvoyé dans le contexte du parent, aucun processus fils n'est créé, et errno contient le code d'erreur.

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 84
    Points : 48
    Points
    48
    Par défaut
    Merci, ça m'aide a mieux comprendre fork mais vous ne repondez pas a mes questions !!

  4. #4
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 195
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 195
    Points : 17 163
    Points
    17 163
    Par défaut
    Et bien si.

    Citation Envoyé par Nymar
    Quel est l'utilité de if (fils==-1) ?? car pour moi je vois qu'on aura jamais ce cas puisque la boule se charge de l'eleminer
    La boucle ne l'élimine pas, elle recommence si on a simultanément fils==-1 et errno==EAGAIN, comme errno peut être défini à autre chose, par fork, c'est un -1 peut apparaitre en sortie de boucle.

    Citation Envoyé par man fork (je préfère l'anglais pour les erreurs, c'est plus précis/sûr)
    EAGAIN
    fork() cannot allocate sufficient memory to copy the parent's page tables and allocate a task structure for the child.
    EAGAIN
    It was not possible to create a new process because the caller's RLIMIT_NPROC resource limit was encountered. To exceed this limit, the process must have either the CAP_SYS_ADMIN or the CAP_SYS_RESOURCE capability.
    ENOMEM
    fork() failed to allocate the necessary kernel structures because memory is tight.

    Citation Envoyé par Nymar
    pour le pid comment est il censé changer car l'auteur de ce code affiche l'execution qui traite a la fois les deux cas c'est a dire a l'execution s'affiche
    Comme tu l'as lu, un second processus est créé, qui ne recoit pas la meme valeur de pid.

    Tu as donc deux processus, le pere, initialement lancé, qui à pid défini à la valeur du PID du fils, et fils, pour qui pid est 0.
    chacun des deux reprends l'exécution juste après le retour de fork (donc à l'évaluation de fils = <retour de fork>)

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 84
    Points : 48
    Points
    48
    Par défaut
    Merci, pour la premiere question vous avez raison je n'ai pas bien interpreter les choses pour la deuxieme question je sais que les processus fils et pere non pas le meme ID mais si on ecrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (fils==0) {fprint(stdout,"fils");}
    else {fprint(stdout,"pere");}
    je m'attend a avoir ou bien le premier message ou bien le deuxieme mais pour l'execution selon l'auteur ce sont les deux messages a la fois qui sont affichés.

  6. #6
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 195
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 195
    Points : 17 163
    Points
    17 163
    Par défaut
    Il y a deux processus, l'un affichera "fils", et l'autre "père".
    à l'exécution du programme, tu verras donc les deux.

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    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 381
    Points : 41 582
    Points
    41 582
    Par défaut
    D'ailleurs, on peut essayer en affichant plus de détails:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void affich(pid_t fils)
    {
    	char buf[80];
    	if(fils==0)
    		sprintf(buf, "Je suis proc %lu, le fils.\n", (unsigned long)getpid());
    	else
    		sprintf(buf, "Je suis proc %lu, le pere. Mon fils est %lu.\n", (unsigned long)getpid(), (unsigned long)fils);
    }

  8. #8
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 84
    Points : 48
    Points
    48
    Par défaut
    Parfait, juste dites moi svp si je omprends bien ce qui ce passe, alors If traite en paralelle deux processus donc l'un satisfait la premiere condition et l'autre satisfait la deuxieme et merci

  9. #9
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 195
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 195
    Points : 17 163
    Points
    17 163
    Par défaut
    Pas exactement.

    Juste avant fork, tu as un programme, qui possède un unique processus, dit "main".
    Juste après, ce même programme possède deux processus: le père (main) et le fils.
    L'ensemble du contexte mémoire est partagé/dupliqué (je ne sais pas, je n'ai pas lu tout le man), et les deux programmes ont le même binaire.

    Les deux processus en sont au même point: fork vient de retourner.
    Ils se déroulent en parallèle (attention, temps partagé, multi-cœur…)
    La seule différence entre les deux processus à cet instant, c'est la valeur qu'a retourné la fonction fork().

    Ce n'est pas le if qui fait les choses en parallèle, c'est juste qu'il y a deux processus similaire, chacun faisant la même chose, jusqu'à ce qu'on utilise l'unique différence qu'ils ont: la valeur retournée par fork(), ici gardée dans fils.

Discussions similaires

  1. Comment linker avec odbc32.lib dans le code ? (avec gcc)
    Par _Audrey_ dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 06/11/2008, 17h40
  2. Explication de code avec la fonction map
    Par mlny84 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 31/10/2007, 13h59
  3. Explication de code - RE
    Par deedoo dans le forum Général Python
    Réponses: 23
    Dernier message: 29/07/2005, 14h00
  4. Explication de code simple
    Par Clad3 dans le forum OpenGL
    Réponses: 3
    Dernier message: 20/03/2005, 11h31
  5. [UML] génération de code avec omondo.uml
    Par RENAULT dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 31/10/2003, 13h14

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