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 :

Les multi pipes


Sujet :

Linux

Vue hybride

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 13
    Par défaut Les multi pipes
    Bonsoir,

    Voila j'ai fais un programme qui utilise les pipes.
    J'arrive a utiliser les pipes entre deux commandes (avec execve) ex: "cat toto.txt | wc -l" ca marche c'est super !!
    Parcontre le multipipe "cat toto.txt | grep tutu | wc -l", je ne sais pas comment faire !!

    Si quelqu'un connait un bon tuto sur les multipipes ou pourrait m'expliquer ca serait genial !!

    Merci,

    Hugo.

  2. #2
    Membre émérite Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat toto.txt | grep tutu | wc
    Ben ça marche ça ! Qu'est ce que tu ne comprends pas ?

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 271
    Par défaut
    Il ya un pipe de trop (le cat est inutile avec grep, sed , ...etc)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    grep tutu toto.txt |wc

  4. #4
    Membre émérite Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Par défaut
    C'était pour l'exemple.

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 836
    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 836
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par hugo1787 Voir le message
    Si quelqu'un connait un bon tuto sur les multipipes ou pourrait m'expliquer ca serait genial !!
    Il n'y a rien de bien difficile à comprendre. Chaque programme Unix a toujours le même comportement
    - s'il a une info à écrire, il l'écrit sur la sortie standard (l'écran)
    Exemple Le programme "cat" t'affichera ses données (le fichier "toto.txt") à l'écran

    - s'il a une info à lire, il la lit l'entrée standard (le clavier)
    ExempleLà, tu dois taper des trucs au clavier en finissant par "CTRL-D" et le programme "wc" te comptera le nb de lettres tapées au clavier

    A partir de là, tout ce qu'il faut saisir c'est que le pipe permet de lier la sortie standard du programme 1 avec l'entrée standard du programme 2. Le programme 1 n'écrit plus son info sur l'écran mais l'envoie dans le pipe et le programme 2 ne lit plus son info du clavier mais du pipe
    Exemple Une fois que t'as bien saisi le comportement général, tu peux l'étendre autant que tu veux. Pour revenir à ton exemple
    - cat toto.txt => affiche le fichier "toto.txt" à l'écran
    - grep tutu => extrait du clavier les lignes contenant la chaîne "tutu" et affiche le résultat à l'écran
    - wc -l => compte le nombre de lignes du clavier et affiche le résultat à l'écran
    En liant ces 3 programmes par des pipes, cela te donnera le résultat suivant
    cat toto.tx |grep "tutu" |wc -l => le contenu du fichier "toto.txt" sera envoyé dans le pipe qui sera utilisé comme entrée pour le grep qui en extraira les lignes contenant "tutu", le grep enverra ces lignes dans le pipe qui sera utilisé comme entrée pour le "wc" qui comptera donc le nombre de lignes et affichera ce résultat à l'écran.

    Et tu peux aussi envoyer ce résultat dans un autre programme pour continuer sur un autre traitement. Exemple:
    cat toto.tx |grep "tutu" |wc -l |awk '{printf("%d\n", $1 * 2)}'
    => le résultat du wc est envoyé a awk qui le multiplie par 2 et affiche le résultat à l'écran. Et on peut encore continuer encore et encore...

    Cependant, certains programmes évolués produisent déjà le résultat voulu donc le pipe, dans ce cas là, est inutile
    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat toto.tx |grep "tutu" |wc -l
    Exemple équivalent sans pipe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -c "tutu" toto.txt
    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]

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 13
    Par défaut
    Bonjour,

    Oui le principe je le comprends. Mais en fait c'est plus au niveau du code.
    Donc jarrive a faire communiquer deux commandes par un pipe
    ex: cat toto.txt | wc -l et ca marche par contre apres je ne sais pas comment faire pour executer plus deux deux commande au travers d'un pipe (ou en crer plusieurs a la suite ??)!

    J'ai essayer d'entrer mon code dans une boucle mais sans resulat !

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    if (pipe(p) < 0)
            {
              war_error(ERR_NO_PIPE);
              return (PIPE_FAILED);
            }
          pid = fork();
          if (pid < 0)
            {
              war_error(ERR_NO_PID);
              return (PIPE_FAILED);
            }
          if (pid == 0) 
            {
              close(p[0]);
              dup2(p[1], 1);
              get_result = my_syspipe(limit, pos);
              if (get_result == SYS_FAILED)
                return (PIPE_FAILED);
            }
          else
            {
              close(p[1]);
              dup2(p[0], 0);
              get_result = my_syspipe(limit, ++pos);
              wait(&status);
              if (get_result == SYS_FAILED)
                return (PIPE_FAILED);
              else
                return (PIPE_SUCCES);
            }
    Peut etre en mettant un fork() avant la creation du pipe dans la boucle ?

    Merci pour vos reponses,

    Hugo

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2007
    Messages : 66
    Par défaut
    Bonjour,

    Est-ce que tu pourrais nous donner le résultat de la commande

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cat toto.txt | grep tutu | wc -l
    car je ne vois pas ce qui pourrait clocher, à part peut-être un problème de fin de ligne pour la dernière ligne du fichier...

    Tu dis vouloir "exécuter plus de 2 commandes au travers d'un pipe". Donc est-ce que ce que tu veux faire c'est afficher les résultats du grep et du wc -l sur une même ligne, pour un même fichier en entrée (ce qui m'étonnerait vu que tu dis avoir compris le principe du pipe, et vu le code ci-dessus)?

  8. #8
    Membre émérite Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Par défaut
    Tu veux les chainer ou en faire lire/écrire plus d'une dans un seul pipe ?

  9. #9
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 91
    Par défaut
    Citation Envoyé par valefor Voir le message
    Tu veux les chainer ou en faire lire/écrire plus d'une dans un seul pipe ?
    tu peux suivre cette exemple la commande est : ps -l| grep wait |wc -l
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <unistd.h>
     
     
    int main(void)
    {  int p[2];
       pid_t pid;
     
     
    /*le premier tube*/
     
       if (pipe(p) == -1)
       {  perror("pipe"); exit(1);
       }
     
       if ((pid = fork()) == -1)
       {  perror("fork");
          exit(1);
       }
     
    	/*le pere*/
       if (pid)
       {  close(p[0]);
          dup2(p[1],1);
          execlp("ps", "ps", "-l", NULL);
          perror("execlp"); exit(1);
       }
       close(p[1]);
       dup2(p[0], 0);
     
     
    /*le deuxieme tube*/
     
       if (pipe(p) == -1)
       {  
    	perror("pipe"); 
    	exit(1);
       }
     
       if ((pid = fork()) == -1)
       {  
    	perror("fork");
          	exit(1);
       }
     
    	/*le père*/
       if (pid)
       {  close(p[0]);
          dup2(p[1],1);
          execlp("grep", "grep", "wait", NULL);
          perror("execlp"); exit(1);
       }
     
    	/*le fils*/
       close(p[1]);
       dup2(p[0], 0);
       execlp("wc", "wc", "-l", NULL);
       perror("execlp");
       exit(1);
    }

Discussions similaires

  1. Les tubes (pipes)
    Par winux32 dans le forum Windows
    Réponses: 3
    Dernier message: 21/04/2008, 08h22
  2. LES TUBES (Pipe)
    Par ould64 dans le forum Linux
    Réponses: 2
    Dernier message: 19/04/2008, 15h36
  3. Exercice en c sur les forks+Pipe+exec
    Par Elendhil dans le forum Linux
    Réponses: 6
    Dernier message: 07/11/2007, 19h32
  4. [MAVEN-PLUGIN]Plugin maven-site et les multi-modules
    Par DanielW33 dans le forum Maven
    Réponses: 3
    Dernier message: 22/10/2007, 16h36
  5. [Conception] Eviter les multi pages
    Par thephpman dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 28/04/2007, 00h16

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