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 :

Comment peut-on faire se faire mordre la queue à deux programmes pipés ?


Sujet :

Linux

  1. #1
    Membre régulier
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Avril 2011
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2011
    Messages : 108
    Points : 97
    Points
    97
    Par défaut Comment peut-on faire se faire mordre la queue à deux programmes pipés ?
    Salut,


    J'essaye de mettre en place une sorte de systême producteur/consommateur mais où la sortie du consommateur réinjecterait sa sortie en entrée du programmes producteur et vice-versa

    Pas de problême pour piper le producteur et le consommateur
    (cf. producteur | consommateur => la sortie standard du producteur devient l'entrée standard du consommateur)

    Mais je ne sais pas comment "boucler la boucle"
    (cf. le consommateur doit aussi répondre au producteur, cf. la sortie standard du consommateur doit aussi devenir l'entrée standard du producteur)

    Le but étant de gérer un systême de questions/réponses évoluées mais où la partie réponse pourrait soit provenir d'une personne devant le clavier, soit d'un automate qui simulerait sa présence.

    A noter que je ne désire pas pas passer par un vrai systême client/serveur car je veux un truc hyper basique qui puissent se lancer en une ligne de commande et qui soit le plus court possible (style de toutes simples commandes comme `producteur | consommateur` ou uniquement `consommateur` si je veux remplacer moi-même le systême producteur quoi ...)

    De l'autre côté, l'utilisation d'un serveur HTML résoudrait facilement le pb (vu que c'est c'est typiquement fait pour ...) mais j'aimerais bien ne pas avoir à utiliser une énorme massue pour écraser un tout minuscule moustique ...



    @+
    Yannoo

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    280
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 280
    Points : 149
    Points
    149
    Par défaut
    avec un tube nommé ?
    "Bien qu'on ait du coeur à l'ouvrage,
    L'Art est long et le Temps est court." - CB

  3. #3
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Dans le processus père, avant de forker, tu créé deux pipes. Puis tu fork, et tu ferme les bon bout de chaque pipe dans chaque processus. Le père écrira dans dans le 1er pipe et lira dans le 2ème. Le fils écrira dans le 2ème pipe et lira dans le 1er.

    Attention toutefois aux problème de deadlock. Pour bien faire les choses il faut que chaque processus (le père et le fils) fasse une boucle de select() (ou poll(), c'est pareil) pour scruter les deux pipes, et faire ce qu'il convient de faire quand l'un des deux pipes est disponible.

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Salut

    Tu ne dis pas si tu es en shell ou en C ou en Python ou en autre chose. Matafan t'a donné une solution C. Voici une solution shell

    création tubes nommé X et Y

    P1
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    tant que
    faire
        travailler
        écrire dans X
        lire Y
    fin faire

    P2
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    tant que
    faire
        lire X
        travailler
        écrire dans Y
    fin faire
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre régulier
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Avril 2011
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2011
    Messages : 108
    Points : 97
    Points
    97
    Par défaut
    Merci, Matafan et Sve@r


    Je vais essayer ça dans la semaine

    De préférence, ce serait pour être utilisé dans un script-shell
    (mais si je vois que c'est trop lent à l'execution, je le ferais passer en C)

    Sve@r, ça ne crée pas un pb s'il n'y a pas systématiquement une réponse après chaque question ?
    (ce serait bien de ne pas être obligé de devoir systématiquement répondre avant qu'une nouvelle question soit posée => un systême de file d'attente serait sûrement mieux ==> donc à mon avis, je vais le faire directement en C car la solution de Sve@r m'a l'air plus souple à ce niveau)


    @+
    Yannoo

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par yannoo95170 Voir le message
    Sve@r, ça ne crée pas un pb s'il n'y a pas systématiquement une réponse après chaque question ?
    Ah si, c'est obligatoire. Un pipe est aussi fait pour synchroniser deux processus. Si l'un écrit alors il faut absolument qu'un autre aille lire sinon le premier est bloqué. Et idem si le premier tente de lire alors que personne n'a écrit dedans...

    Citation Envoyé par yannoo95170 Voir le message
    un systême de file d'attente serait sûrement mieux ==> donc à mon avis, je vais le faire directement en C car la solution de Sve@r m'a l'air plus souple à ce niveau)
    Exact tu auras plus de souplesse en C qu'en shell...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. [Débutant] Comment peut-on faire une include dans C# ?
    Par aspkiddy dans le forum C#
    Réponses: 3
    Dernier message: 11/04/2012, 16h22
  2. Réponses: 3
    Dernier message: 19/11/2009, 11h36
  3. Réponses: 1
    Dernier message: 28/06/2007, 12h23
  4. Réponses: 2
    Dernier message: 28/12/2006, 18h43

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