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 :

synchronisation des processus : Fonction wait()


Sujet :

C

  1. #1
    Membre averti
    Inscrit en
    Février 2013
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Février 2013
    Messages : 25
    Par défaut synchronisation des processus : Fonction wait()
    Bonjour,

    Je suis entrain de comprendre comment bien placer le wait() dans mon code pour une meuleur synchronisation entre le processus père et fils.
    J'ai compris que la fonction wait() permet à un processus père d’attendre jusqu’à ce qu’un processus fils terminer et retourne l’identifiant du processus fils et son état de terminaison.

    Ce que je comprend pas :

    Dans des codes je trouve qu'ils utilisent : wait(Null) et wait (&status), c'est quoi la déférence ?
    Aussi, c'est quoi la déférence entre wait() et exit()

    Merci pour votre aide

  2. #2
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Tout est dans le manuel, on peut passer NULL à wait si on n'est pas intéressé par la récupération de l'état du fils.

    exit n'a pas grand chose à voir, cette fonction termine le processus. À noter qu'il faut parfois lui préférer _Exit, ça dépend du cas d'utilisation.

  3. #3
    Membre très actif
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 548
    Par défaut
    Bonsoir,
    Citation Envoyé par ragheb_dev Voir le message
    Bonjour,

    Je suis entrain de comprendre comment bien placer le wait() dans mon code pour une meuleur synchronisation entre le processus père et fils.
    J'ai compris que la fonction wait() permet à un processus père d’attendre jusqu’à ce qu’un processus fils terminer et retourne l’identifiant du processus fils et son état de terminaison.

    Ce que je comprend pas :

    Dans des codes je trouve qu'ils utilisent : wait(Null) et wait (&status), c'est quoi la déférence ?
    Aussi, c'est quoi la déférence entre wait() et exit()

    Merci pour votre aide
    wait() permet à un processus parent de connaître l’état du processus fils par l’intermédiaire d’un pointeur elle renvoie le PID du fils terminé et si le pointeur fourni en paramètre est non NULL il contiendra une valeur correspond à l’état de terminaison du processus (circonstance d’arrêt / sortie du processus Exemple: est-ce que le processus fils a-t-il fait appel à exit() ou return si oui une invocation de exit() où return a été émise, quel est alors le code retour transmis à exit() ou le code retour de return ? sinon cas contraire a-t-il été tué par un signal? si oui , lequel, Etc.). cas contraire si l’on n’est pas intéressé par l’État de fin du processus fils il faut alors définir un NULL.
    Il est donc fortement conseillé de connaître l’état de sortie du processus fils et prendre des mesures nécessaires contre les processus zombie.

    Une petite remarque importante tout de même : La fonction "wait()" bloque le processus appelant jusqu'à ce qu’un de ces fils termine (d’ailleurs, c’est pour une de ces raisons que "waitpid ()" a été crée). Il faut également comprendre que si un processus est dans l’état zombie, la primitive "wait" reviens immédiatement.

    Citation Envoyé par ragheb_dev Voir le message
    Bonjour,
    .........
    Aussi, c'est quoi la déférence entre wait() et exit()
    Merci pour votre aide
    Citation Envoyé par Matt_Houston Voir le message
    Tout est dans le manuel, on peut passer NULL à wait si on n'est pas intéressé par la récupération de l'état du fils.

    exit n'a pas grand chose à voir, cette fonction termine le processus. À noter qu'il faut parfois lui préférer _Exit, ça dépend du cas d'utilisation.
    La différence est la suivante: Lorsque vous invoquer la fonction exit() celle-ci inscrit l’événement ainsi que le code de sortie dans la tableau de processus du noyau cette table sera interrogée par la suite (grâce à l'appel de fonctions wait() ou waitpid() ) par le noyau sous la demande du processus parent (Shell le plus souvent) pour connaître l’état de terminaison du processus fils. Le code de sortie du programme sera alors mis dans une variable de Shell à disposition.
    Plus précisément voilà ce qui se passe a l’invocation d’exit() :
    • Elle invoque toutes les fonctions enregistrées a l’aide de la fonction atexit() ou on_exit()
    • Elle ferme tous les flux d’entrées-sorties en écrivant toutes les données situées dans les buffers et supprime les fichiers obtenus par « tmpfile() »
    • Elle invoque l’appel système _exit() qui terminera le processus en:

      • Close tous les descripteurs de fichier. Le ou les processus fils sont/ est alors adopté par le processus « init » qui lira immédiatement le code retours pour éviter qu’il ne reste à l’état zombie prolongé.
      • Le processus père reçoive un signal SIGCHLD dans certains cas si le processus est un processus créateur du groupe ( dit processus leader) celui-ci peut tout à fait émettre le signal SIGHUP qui est transmis à tous les processus en avant-plan du terminal de la session (Shell)
      • Si le processus est leader de son groupe il peut transmettre le signal SIGHUP et SIGCONT pour les membres du groupe qui sont orphelins.
      • Dernier points, le système d’exploitation va libérer les ressources verrouillées et procède à l’interrogation de la table de processus et met un terme au processus. Le pointeur fourni en paramètre contiendra alors une valeur correspondant à l’état de terminaison du processus (circonstance d’arrêt / sortie du processus)


    Pour faire simple l’invocation d'exit() avec un code retours correspondant au code d'erreur défini déclenche en amont des traitements et met fin au processus de façons indirectes à travers la fonction _exit(). Quant à wait() elle bloque le processus appelant jusqu'à ce qu'un de ces fils se termine.
    Notée aussi que la fonction wait() peut échouer et dans ce cas elle renvoie -1 en plaçant l'erreur ECHILD dans errno dans le cas ou le processus appelant n'a pas de fils.
    Petit rappel sur ce que j'ai déjà écrit : "Sous le système Linux ou Unix, les valeurs de retour du main tiennent tous sans exception sur 8bits (0-255 inclus donc 1 octet), et si votre programme renvoie la valeur -1(par exemple), le Shell lit la valeur 255 car -1 est tronqué aux bits le moins significatifs et le renvoie en tant que octet non signé. Cela est fait exprès pour que la valeur de renvoie soit différente de 0 ( 0 qui veut dire tout c’est bien passé).

    Un programme sous Linux où Unix termine donc toujours avec une valeur 0, dans le cas contraire, une valeur différente de zéro indique l’erreur qui s’est produite. Ces différentes erreur correspond à une plage d’erreurs Linux définie dans l’entête "errno.h" et qui tient dans 1 octet (0-255). Des codes de retour différents dits/appeler "code retours personnalisés" sont souvent utilisés à des fins de test ou autre et ce à des buts bien définis. Tout de même les valeurs de retours supérieur a 255 seront systématiquement tronqué voir exemple . Il ne faut pas penser que int devant la fonction main permet ou vous permet de renvoyer une valeur de retour sur 32 bits c'est totalement faux. Sous Linux où Unix les valeurs de retours doivent toujours tenir dans 1 octet d'ailleurs si vous essayez avec les valeurs supérieur à 255 elles seront toutes tronquées.
    "


    à bientôt

Discussions similaires

  1. ordonnancement et synchronisation des processus
    Par maestroENSI dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 14/11/2010, 17h45
  2. synchronisation des processus
    Par ouadie99 dans le forum C#
    Réponses: 3
    Dernier message: 10/04/2008, 13h55
  3. synchronisation des processus a l'aide des signaux
    Par dammak_info dans le forum Linux
    Réponses: 1
    Dernier message: 29/12/2007, 08h59
  4. Réponses: 2
    Dernier message: 29/03/2007, 17h43
  5. [Synchronisation des processus] Problème du boulanger
    Par Giovanny Temgoua dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 26/02/2005, 12h40

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