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

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 17
    Points : 6
    Points
    6
    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 é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 : 46
    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
    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 17
    Points : 6
    Points
    6
    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 é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 : 46
    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
    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 17
    Points : 6
    Points
    6
    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 é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 : 46
    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
    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.

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Rebonjour, n'ayant pas su codé la fonction je me suis tourné vers une boucle for et je me suis confronté à un autre problème. En effet il semblerait que lors de l'initialisation de ma paire de descripteurs fd, celle-ci n'accepte pas de l'être par une variable.
    J'ai donc : fd[2] ok mais fd[p] ne marche pas avec p = 2 par exemple.
    Savez-vous d'où peut venir le problème ? Merci.

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    À moins de compiler en langage C99, un tableau doit avoir pour taille une constante connue à la compilation. Et encore, le C est plus restrictif que le C++ sur la signification de ce terme.

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    En fait le problème vient de la fonction pipe qui n'accepte pas de recevoir un tableau initialisé par une variable. Par contre, si j'initialise le tableau des descripteurs avec un entier, ca marche.

  10. #10
    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 : 46
    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
    Je ne comprend pas trop ce que tu dis... Il n'y a rien à initialiser avant l'appel à pipe(), puisque c'est justement pipe() qui va mettres les numéros de fd dans le tableau à deux éléments que tu lui passe en paramètre.

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Oui effectivement j'ai confondu les termes initialiser et déclarer. C'est bien de la déclaration dont je parlais.

  12. #12
    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 : 46
    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
    Ah bon alors le problème c'est bien ce qu'a expliqué Médinoc : un tableau doit avoir une taille fixe, déterminée à la compilation (sauf en C99, mais mieux vaut ne pas en parler).

  13. #13
    Candidat au Club
    Inscrit en
    Septembre 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 5
    Points : 3
    Points
    3
    Par défaut projet pipes
    Bonjours à tous

    J'ai aussi un projet sur la gestion des pipes à faire.
    Mais je ne comprend rien du tout même avec vos explications je ne vois pas comment il faut que je fasse.
    Pourriez vous m'aidez. En me donnant un petit bout de code, ou les commande de base à utiliser pour ces manipulations.
    Merci d'avance.

  14. #14
    Membre actif Avatar de ironzorg
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 288
    Points : 245
    Points
    245
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    À moins de compiler en langage C99
    Ouch, le C99 est une norme, pas un langage.

    Nuxcarenis55: les tableaux pour gerer le multipipes c'est moche, my_str_to_wordtab c'etait bien pendant la piscine

    Les listes chainees simples sont plus simple a utiliser qu'un double tableau.

  15. #15
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Citation Envoyé par ironzorg Voir le message
    Ouch, le C99 est une norme, pas un langage.
    Mais quand tu en parles aux gars de chez Microsoft, ils ont l'impression que tu parles une autre langue

  16. #16
    Membre actif Avatar de ironzorg
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 288
    Points : 245
    Points
    245
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Mais quand tu en parles aux gars de chez Microsoft, ils ont l'impression que tu parles une autre langue
    Quand tu en parles ou ?

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