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 :

Enchainement de pipes


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 17
    Par défaut Enchainement de pipes
    Bonsoir à tous, après avoir cherché longtemps et n'ayant pas trouvé de réponses concluantes, je me décide à poster ici.
    En effet, je n'arrive pas à trouver une implémentation en C pour faire du multipipe. J'ai lu qu'on pouvait le faire en récursif mais je ne vois pas du tout comment ...
    Merci de votre aide.

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

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Ca veut dire quoi pour toi "faire du multipipe" et "le faire en récursif" ? Explique un peu ce que tu veux faire.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 17
    Par défaut
    En effet j'ai peut-être pas été assez clair
    Je souhaite faire une implémentation en C de ce qu'on retrouve en bash, du style : cmd1 | cm2 | ... | cmdn.
    Je sais que je dois utiliser les fonctions execX, pipe, fork et dup2 mais je ne vois pas comment.
    Merci de t'intéresser à mon problème

    Edit : je souhaite le faire avec un nombre indéterminé de commandes.

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

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    En supposant que tu es dans le process qui va exécuter la commande à gauche du pipe, ça se passe en gros comme ça :

    1. pipe()
    2. fork()
    3. Dans le fils :
      1. close() du coté "write" du pipe
      2. dup2() pour connecter le coté "read" du pipe à stdin
      3. execve() de la commande à droite du pipe
    4. Dans le père :
      1. close() du coté "read" du pipe
      2. dup2() pour connecter le coté "write" du pipe à stdout
      3. execve() de la commande à gauche du pipe

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 17
    Par défaut
    Merci matafan d'avoir répondu mais débutant en programmation système, je me pose ces 2 questions :
    En quoi ce que tu m'as donné me permet d'exécuter n commandes pipées ?
    Faut-il que j'ouvre une paire de descripteur de fichiers pour chaque pipe ?

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

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Tu peux enchainer ces étapes plusieurs fois si tu dois enchainer plusieurs commandes. La procédure que j'ai décrite réalise cmd1 | cmd2, avec cmd1 dans le process original et cmd2 dans le process forké. Si tu veux faire cmd1 | cmd2 | cmd3, alors dans le process fils, avant le execve, tu recommence la procédure. Tu prend toutes les étapes que j'ai donné, tu remplace cmd1 par cmd2 et cmd2 par cmd3, et tu les insère à la place de 3.3. Ca donne :

    1. pipe()
    2. fork()
    3. Dans le fils :
      1. close() du coté "write" du pipe
      2. dup2() pour connecter le coté "read" du pipe à stdin
        1. pipe()
        2. fork()
        3. Dans le fils :
          1. close() du coté "write" du pipe
          2. dup2() pour connecter le coté "read" du pipe à stdin
          3. execve() de cmd3
        4. Dans le père :
          1. close() du coté "read" du pipe
          2. dup2() pour connecter le coté "write" du pipe à stdout
          3. execve() de cmd2
    4. Dans le père :
      1. close() du coté "read" du pipe
      2. dup2() pour connecter le coté "write" du pipe à stdout
      3. execve() de cmd1

    Effectivement, tu dois faire un pipe() par "|" dans ta ligne de commande.

Discussions similaires

  1. Pipes - Comment faire ?
    Par Neitsa dans le forum x86 32-bits / 64-bits
    Réponses: 4
    Dernier message: 11/12/2003, 05h44
  2. [C/S] Boken Pipe
    Par Gogoye dans le forum POSIX
    Réponses: 4
    Dernier message: 23/10/2003, 10h48
  3. MSXML2, enchainer deux feuilles de Style
    Par burno dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 10/09/2003, 13h47
  4. Réponses: 3
    Dernier message: 21/08/2003, 14h47
  5. Problème : bloquage d'un pipe
    Par Nicaisse dans le forum POSIX
    Réponses: 10
    Dernier message: 24/07/2003, 11h06

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