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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    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
    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

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    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 202
    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 actif
    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
    Par défaut
    Merci, ça m'aide a mieux comprendre fork mais vous ne repondez pas a mes questions !!

  4. #4
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    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 202
    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 actif
    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
    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

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    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 202
    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.

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