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 :

[C] Shell recode : multiples input/output


Sujet :

Linux

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 140
    Par défaut [C] Shell recode : multiples input/output
    Bonjour,

    Voilà, je suis en train de faire la recode d'un shell de type UNIX. Plus précisément je suis en train de réfléchir à la phase d'exécution et au parcours de mon arbre.

    Certains shells, zsh pour ne pas le nommer , gèrent des redirections d'entrées/sorties multiples. Par exemple :

    < FICH1 < FICH2 < FICH3 cat
    cat > FICH1 > FICH2 > FICH3

    Les deux exemples ci-dessus sont les cas les plus simples concernant la problématique des multiples redirections ( < FICH1 ls -l | < FICH2 grep "mot" > FICH3 | wc -l ).

    J'arrive à gérer une redirection d'entrée et une redirection de sortie pour chaque commande simple ou chaque enchaînement de pipe, comme ls -l | grep toto | wc -l > FICH ou << EOF cat > FICH.

    Ce que j'aimerais, c'est pouvoir gérer plusieurs redirections, comme peut le faire zsh. J'ai essayé de voir comment on pouvait précéder, mais sans succès.

    Je pense que copier un fichier dans un autre fichier et ainsi de suite n'est pas "propre" : je redirige le résultat de la commande dans le premier fichier, puis je copie le contenu du premier dans le deuxième et ainsi de suite... Ca m'étonnerait que ce soit la meilleure façon. De même si je copie tous les fichiers d'entrée dans un unique fichier et que je passe le fd de cet unique fichier à dup2.

    J'ai essayé de connecter la sortie d'une commande à plusieurs fd, mais c'est sans succès pour le moment.

    Je pense qu'il y a de bien meilleures solutions, donc si vous avez des idées/suggestions, je suis preneur. Merci par avance.

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    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 830
    Billets dans le blog
    1
    Par défaut
    Je m'étais amusé une fois à recoder un exemple style ls |grep ... | tr ... |...
    J'utilisais des fork et des pipes en cascade en remplaçant (dup2) à chaque fois stdin ou stdout par le pipe créé...
    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]

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 140
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Je m'étais amusé une fois à recoder un exemple style ls |grep ... | tr ... |...
    J'utilisais des fork et des pipes en cascade en remplaçant (dup2) à chaque fois stdin ou stdout par le pipe créé...
    Bonjour,

    Merci de te pencher sur la question, mais je ne crois pas que tu répondes au problème posé. Mon problème n'est pas de coder un "multipipe" (ça je l'ai déjà fait), mais plutôt de rediriger un fd sur plusieurs fds différents et inversement de rediriger plusieurs fds sur un unique.

    En continuant mes recherches, j'ai cru comprendre que cela s'appelait du multiplexage et que la commande UNIX tee le faisait.
    J'aurais bien aimé savoir comment on codait ce genre d'algo et quelle était sa difficulté.

    En attendant, je me limite à une entrée et une sortie par commande.

    Merci

  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
    Tu te poses trop de questions. En fait c'est tout con, c'est à ton shell d'ouvrir les n fichiers spécifiés et de faire n write() dans ces fichiers. Si tu veux écrire dans deux fichiers il faut faire deux write(). Ca ne peut pas se régler avec de simples manipulations sur les fd (dup/dup2).

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    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 830
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Merillym Voir le message
    En continuant mes recherches, j'ai cru comprendre que cela s'appelait du multiplexage et que la commande UNIX tee le faisait.
    Bah, tout ce que fait tee est d'ouvrir le fichier demandé et de tout écrire ce qui vient de stdin à la fois
    - dans le fichier
    - dans stdout

    Citation Envoyé par matafan Voir le message
    Ca ne peut pas se régler avec de simples manipulations sur les fd (dup/dup2).
    Oui ça c'est exact. Contrairement à son nom, dup ne duplique pas, il remplace...
    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 émérite
    Avatar de Celelibi
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 087
    Par défaut
    Non, en cas de MILTIOS tu ne peux pas te contenter de brancher le fichier sur l'entrée/sortie standard du processus. Il va te falloir un processus supplémentaire.

    En cas d'entrées multiples, il suffit de remarquer l'équivalence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    mycmd < FIC1 < FIC2 < FIC3
    cat FIC1 FIC2 FIC3 | mycmd
    Et il te reste plus qu'à créer un processus qui effectue ça.
    De même pour les sortie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    mycmd > FIC1 > FIC2 > FIC2
    mycmd | tee FIC1 > FIC2 > FIC3
    Et même, si tu veux pas t'emmerder, tu réutilises directement les commandes cat et tee.
    Sinon, les appels système tee et splice peuvent être utile.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 140
    Par défaut
    Bonjour,

    Merci pour vos réponses, ça me donne des pistes intéressantes

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [OpenOffice][Tableur] General input/output error sur Calc
    Par jmchantelou dans le forum OpenOffice & LibreOffice
    Réponses: 0
    Dernier message: 07/12/2007, 21h53
  2. Cipher Input/Output Stream
    Par Razgriz dans le forum Sécurité
    Réponses: 16
    Dernier message: 13/05/2007, 16h32
  3. erreur input output
    Par kanzarih dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 05/11/2006, 00h40
  4. Problème input/output fichier
    Par nenekes dans le forum Cobol
    Réponses: 3
    Dernier message: 09/09/2006, 22h54
  5. Multiple "input" pour un LookupDispatchAction ?
    Par petitpasdelune dans le forum Struts 1
    Réponses: 3
    Dernier message: 16/06/2006, 19h28

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