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 :

Processus tué derriere un pipe, comment savoir sans écrire dedans?


Sujet :

Linux

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 6
    Par défaut Processus tué derriere un pipe, comment savoir sans écrire dedans?
    Bonjour à tous,

    Je vous explique mon problème, j'ai un processus A et un processus B.

    Le processus A envoie des informations à B via un pipe.

    Pour l'utilisateur, seul le processus B est utilisé, c'est pourquoi je voudrai que le processus A se termine lors de l'arret du B.

    J'ai donc mis en place l'interception du SIGPIPE dans mon processus A comme ceci :

    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
    18
    19
    20
    21
     
    static void sig_handler (int sig)
    {
      printf ("\nCaught signal %d, cleaning up and exiting\n", sig);
      cleanup ();
      signal (sig, SIG_DFL);
      kill (getpid (), sig);
    }
     
     
    int main(void) {
      struct sigaction action;
     
      /* setup callback function for SIGINT & SIGPIPE signals */
      action.sa_handler = sig_handler;
      sigaction(SIGINT, &action, NULL);
      sigaction(SIGPIPE, &action, NULL);
     
    ...
     
    }

    Le problème c'est que SIGPIPE n'est lancé que si mon processus A tente d'écrire dans le pipe (normal), or dans le cas de mes processus, si on quitte le processus B, c'est que le A n'écrira plus rien.

    J'aimerai donc trouver un moyen de quitter proprement le A dès la fin du B, même sans écriture dans le PIPE.

    Merci d'avance

  2. #2
    Membre émérite
    Inscrit en
    Avril 2007
    Messages
    667
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Avril 2007
    Messages : 667
    Par défaut
    Salut,
    Pourquoi ne pas forcer B a envoyer SIGTERM (par exemple) a A lorsqu'il quitte?

    Et si par hasard A est le pere de B, c'est fait automatiquement (SIGCHLD).

  3. #3
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 6
    Par défaut
    Parce que je n'ai pas le contrôle de B. A est MON programme qui lance un logiciel existant et non modifiable, et lui envoie des données en live.

    Je ne peux modifier le code que de A.

  4. #4
    Membre expérimenté
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Par défaut
    si A lance B (execl) et que A doit detecter la fin de B, comme l'a dis tontonfred, il suffis de gerer le signal SIGCHLD. tous les enfans d'unp processus enverron ce signal a leur pere à leur mort

  5. #5
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 6
    Par défaut
    Je me suis super mal exprimé, toutes mes excuses.
    A ne lance pas B. Le truc se passe comme ça dans la console :

    $ ./progA | progB

    d'ou l'interception du SIGPIPE (qui ne sert a rien, ou presque).

    progA est une application en mode terminal.
    progB est en graphique et traite en live les données sorties de progA

    Je voudrai donc que lorsque l'on clique sur la fermeture de la fenetre de progB, progA s'en rendre compte par un autre moyen que d'aller écrire dans le tube pour recevoir un SIGPIPE.

  6. #6
    Membre expérimenté
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Par défaut
    le seul moyen de communication mis en oeuvre entre tes deux processus est le pipe ! c'est donc le seul moyen (à mon avis) de savoir si B est toujours la ou pas.
    sous linux, un processus a l'impression d'etre le seul a tourner sur le PC, il ne peut avoir aucune information sur un autre processus si tu ne lui donne pas un moyen de communication.
    si B n'envoie pas par le pipe son pid, A ne pourra pas (autrement que par le pipe) savoir quoi que ce soit sur B

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/04/2014, 09h43
  2. Comment savoir si un fichier est utilisé sans le bloquer ?
    Par pofet dans le forum Windows Forms
    Réponses: 4
    Dernier message: 16/08/2011, 10h51
  3. Réponses: 2
    Dernier message: 01/04/2009, 00h27
  4. Réponses: 9
    Dernier message: 26/04/2007, 12h09
  5. Réponses: 2
    Dernier message: 03/11/2006, 11h36

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