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

Programmation et administration système Perl Discussion :

Gestion du SIGPIPE


Sujet :

Programmation et administration système Perl

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 41
    Par défaut Gestion du SIGPIPE
    Bonjour à tous,

    Je lance une commande du type a | b sous linux. le processus b lit sur son entrée standard la sortie standard de a.

    Ce qui m'embête c'est la gestion du Ctrl-C, dans cette situation b s'arrête et a prend un SIGPIPE en tentant d'écrire vers sa sortie standard. Et c'est là que se situe mon problème. b envoyait vers la sortie standard les messages d'erreur (notamment ceux de a). b ayant disparu chaque écriture de a se solde par un SIGPIPE et je n'arrive pas dans a à reprendre le contrôle de mon traitement et notamment sortir en levant les locks etc...

    J'ai bien positionné dans a un handler sur ce signal qui exécute un die() pourtant je n'arrive pas à reprendre la main et finaliser mon traitement. Je ne suis pas sur d'avoir réussi à expliquer simplement et clairement mon problème :-(

    Comment dois je procéder ?

  2. #2
    Membre chevronné Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 58

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Par défaut
    Peux-tu montrer le bout de code en question ? Cela aidera à ce faire une idée (fais-tu un fork dans le script? captures-tu simplement le signal? etc)

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 41
    Par défaut
    Merci pour ta réponse,

    Ce n'est pas simple de te montrer le code car il est dispatché dans pas mal de programme. Mais je vais plutôt essayer de reformuler ma question. Une fois que b est mort, a va prendre un SIGPIPE à chaque fois qu'il va essayer d'écrire sur la sortie standard. En fait je pense que le système kill mon process, ce qui l'empêche de finaliser son traitement, pour éviter une boucle. En effet j'intercepte le signal SIGPIPE mais dans ce traitement d'erreur je vais continuer d'écrire sur la sortie standard qui est devenue indisponible et donc reprendre un SIGPIPE, etc...

    La question finalement serait plutôt, comment puis je rediriger ma sortie standard vers l'écran par exemple sur interception de ce signal ?

  4. #4
    Membre éprouvé Avatar de jean.2edi
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 106
    Par défaut
    Il me semble que tu ne peux pas rediriger la sortie standard vers l'écran ! Quand tu as lancé ta commande
    le système, ou plus exactement le shell, a redirigé la sortie standard de a vers l'entrée standard de b au lieu de garder cette sortie vers lui pour l'afficher sur le terminal. A la mort de b, ce flux n'est plus valide, ce qui vaut à a de recevoir des SIGPIPE.
    1. Si tu veux continuer à faire fonctionner a et voir sa sortie, ce que tu peux faire, c'est
      • soit utiliser la seconde sortie : erreur standard de a à partir du moment où tu reçois le SIGPIPE (Remarque: les messages d'erreur de a devraient être écrits sur stderr),
      • soit dupliquer la sortie de a vers un fichier de log par exemple.
    2. Si tu veux arrêter a, ça devrait marcher avec l'interception du SIGPIPE : si ce sont les messages qui te gênent, il faut là encore utiliser stderr !

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 41
    Par défaut
    Citation Envoyé par jean.2edi Voir le message
    Il me semble que tu ne peux pas rediriger la sortie standard vers l'écran ! Quand tu as lancé ta commande
    le système, ou plus exactement le shell, a redirigé la sortie standard de a vers l'entrée standard de b au lieu de garder cette sortie vers lui pour l'afficher sur le terminal. A la mort de b, ce flux n'est plus valide, ce qui vaut à a de recevoir des SIGPIPE.
    1. Si tu veux continuer à faire fonctionner a et voir sa sortie, ce que tu peux faire, c'est
      • soit utiliser la seconde sortie : erreur standard de a à partir du moment où tu reçois le SIGPIPE (Remarque: les messages d'erreur de a devraient être écrits sur stderr),
      • soit dupliquer la sortie de a vers un fichier de log par exemple.
    2. Si tu veux arrêter a, ça devrait marcher avec l'interception du SIGPIPE : si ce sont les messages qui te gênent, il faut là encore utiliser stderr !
    Merci pour cette réponse, je pense que je vais m'orienter effectivement vers l'utilisation de stderr.

Discussions similaires

  1. Réponses: 2
    Dernier message: 31/08/2002, 21h37
  2. Gestion de matrice
    Par bzd dans le forum C
    Réponses: 4
    Dernier message: 12/08/2002, 18h19
  3. Réponses: 4
    Dernier message: 04/07/2002, 12h31
  4. c: gestion des exceptions
    Par vince_lille dans le forum C
    Réponses: 7
    Dernier message: 05/06/2002, 14h11
  5. gestion d'un joystick ...
    Par Anonymous dans le forum DirectX
    Réponses: 1
    Dernier message: 23/05/2002, 12h53

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