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 travailler avec pipe


Sujet :

Linux

  1. #1
    Nouveau membre du Club
    Inscrit en
    Décembre 2007
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 65
    Points : 35
    Points
    35
    Par défaut comment travailler avec pipe
    slt tt le monde !!
    SVP ,est ce qu'il y 'a quelqu'un parmi vous qui peut me dire comment ça fonctionne quand je tape deux commandes en pipe .
    exp : commande1 | commande2

    j'ai lu dans pas mal de livres , ils disent que la commande1 s'execute et met son resultat dans un tube pour que la deuxiéme commande2 l'utilise . mais jusqu'a maintenant j'arrive pas a comprendre comment ça se réalise avec la fonction pipe() !!!SVP, si vous pouvez me l'illustrer a travers un petit code .
    merci bcp à vous

  2. #2
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    ce qui se passe en fait est une redirection de flux: le flux standard de sortie (stdout, soit l'ecran) de la comande de gauche est redirigé vers le flus standar d'entree de l'autre (stdin: le clavier)

    grosso modo voila comment ca fonctionne:
    prenons l'exemple de who | wc
    le shell va dabord creer un pipe
    ensuite il va faire deux forks un pour le who et un autre pour le wc


    dans le processus de gauche il va fermer le descripteur de fichier de stdout cad: 0
    dans le processus de droite il ferme stdin cad 1

    dans chacun des nouveau processus il va faire appel a dup, qui, comme le dit la page de man, duplique le descripteur de fichier qu'on lui passe en argument a la premiere place disponible...c'est a dire, dans le processus wc il prendra la place de stdout (qui a été fermé)
    et dans who il prendra la place de stdin
    la redirection est faite

    on peut enfin appeler execl pour charger who et wc dans nos nouveaux processus



    j'explique tres mal je sais, mais voici un code qui te permettra de mieux comprendre tout ca

    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
    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
    main(void)
    {
          int pfd[2];
          if (pipe(pfd) == -1)
                syserr("pipe");
          switch (fork()) {
          case -1:
                syserr("fork");
          case 0:
                if (close(1) == -1)
                       syserr("close");
                if (dup(pfd[1]) != 1)
                       syserr("dup");
                if (close(pfd[0]) == -1 || close(pfd[1]) == -1)
                       syserr("close2");
                execlp("who","who",NULL);
                syserr("execl");
          }
          switch (fork()) {
          case -1:
                syserr("fork");
          case 0:
                if (close(0) == -1)
                       syserr("close3");
                if (dup(pfd[0]) != 0)
                       syserr("dup3");
                if (close(pfd[0]) == -1 || close(pfd[1]) == -1)
                       syserr("close4");
                execlp("wc","wc",NULL);
                syserr("execl2");
          }
          if (close(pfd[0]) == -1 || close(pfd[1]) == -1)
                syserr("close5");
          while (wait(NULL) != -1);
    }
    /*-----------------------------------------------------------------*/
    /*            Traitement des erreurs                               */
    /*-----------------------------------------------------------------*/
    syserr(char *s)
    {
          printf("erreur de la primitive ");
          printf("%s\n",s);
          exit(1);
    }

  3. #3
    Nouveau membre du Club
    Inscrit en
    Décembre 2007
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 65
    Points : 35
    Points
    35
    Par défaut
    re
    merci M.kamouminator mais encore j'ai quelques ambiguités :

    normalement on a 2 descripteurs de fichier pfd[0] et pfd[1] ,d'abord il y' a
    combien de fichiers 2 aussi ou combien ?

    en plus si j'ai plusieurs commandes qui s'executent en pipe, le vecteur pfd a
    tjrs deux cases seulement ou il a le même nombre de cases que de
    commandes ??
    et en dernier l'instruction conditionnelle ou il y 'a close(1) veut dire quoi le 1
    comme paramétre .j'ai pas trouvé dans le manual !!

    merci bcp

  4. #4
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par laracroft87 Voir le message
    et en dernier l'instruction conditionnelle ou il y 'a close(1) veut dire quoi le 1
    comme paramétre .j'ai pas trouvé dans le manual !!
    Oui c'est codé n'importe comment
    close(1) <=> close(STDOUT_FILENO) <=> fermeture de la sortie standard
    close(0) <=> close(STDIN_FILENO) <=> fermeture de l'entrée standard

  5. #5
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    667
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2007
    Messages : 667
    Points : 870
    Points
    870
    Par défaut
    Salut
    Citation Envoyé par laracroft87 Voir le message
    normalement on a 2 descripteurs de fichier pfd[0] et pfd[1] ,d'abord il y' a combien de fichiers 2 aussi ou combien ?

    en plus si j'ai plusieurs commandes qui s'executent en pipe, le vecteur pfd a tjrs deux cases seulement ou il a le même nombre de cases que de commandes ??
    Un pipe == un tableau de 2 descripteurs (une entree + une sortie).
    Plusieurs pipes == plusieurs tableaux de 2 descripteurs
    Si tu veux piper trois commandes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    commande1 | commande2 | commande3
    il te faut 2 pipes (ou 3, suivant ce que tu veux faire du resultat de commande3).

  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 730
    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 730
    Points : 31 053
    Points
    31 053
    Billets dans le blog
    1
    Par défaut
    Pour simplifier: tout processus possède de façon automatique 2 canaux IO
    1) le canal input (le clavier)
    2) le canal output (l'écran)
    Il possède aussi un 3° canal mais il est inutile d'en parler ici.

    Le pipe est un mécanisme intégré au noyau Unix permettant de lier la sortie du processus 1 à l'entrée du processus 2. Ainsi tout ce que le processus 1 affiche devient data pour le processus 2. Et comme le processus 2 possède lui-aussi un canal output sur lequel il affichera ses infos, rien n'empêche de le lier au canal input d'un processus 3 etc etc etc...

    Citation Envoyé par laracroft87 Voir le message
    j'arrive pas a comprendre comment ça se réalise avec la fonction pipe() !!!
    La fonction pipe() est une fonction offerte aux programmeurs qui veulent faire communiquer différents procesuss issus d'un même programme. On lui passe en paramètre un tableau de 2 int et elle remplit le tableau avec 2 descripteurs fichiers, les 2 descripteurs étant liés à un pipe généré en mémoire par le noyau.
    Un des descripteurs sert à écrire dans le pipe, l'autre sert à lire le pipe, l'ensemble des 2 opérations permettant à 2 processus (chacun étant totalement indépendant et isolé dans son exécution) de se transmettre des infos.

Discussions similaires

  1. [DW MX2004] Comment travailler avec Excel?
    Par pierrot10 dans le forum Dreamweaver
    Réponses: 3
    Dernier message: 11/05/2006, 17h34
  2. Comment travailler avec Win32
    Par Mathieu.J dans le forum MFC
    Réponses: 4
    Dernier message: 25/01/2006, 09h49
  3. [XSLT] Comment travailler avec la balise <br/>
    Par billou13 dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 11/10/2005, 10h47
  4. Comment travailler avec le port IEEE 1394?
    Par Cornejito dans le forum MFC
    Réponses: 6
    Dernier message: 04/05/2005, 14h22
  5. Comment travailler avec le client ?
    Par mathieu dans le forum Gestion de projet
    Réponses: 3
    Dernier message: 12/10/2004, 20h56

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