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

Unix Discussion :

Comment créer son propre pipe dans son propre shell?


Sujet :

Unix

  1. #1
    Membre confirmé
    Homme Profil pro
    Etudiant
    Inscrit en
    Novembre 2015
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 156
    Par défaut Comment créer son propre pipe dans son propre shell?
    Bonsoir!
    j'essaie de créer mon propre shell et j'ai rencontrer quelques problèmles:
    Indeed when I try such a command I have

    J'ai réalisé une fonction commande qui est sensée lire et appliquer ce qu'il y a dans le dans un tableau respP qui est mis en place par une fonction parsing qui a été donnée par mon professeur.

    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
     
    void parsing(){
        int i=0;
        int cmot=0;
        while(1){
            c = getchar();
            if      (c == '\n') {symboleP = 0;return;}
            else if (c == ';')  {symboleP = 1;return;}
            else if (c == '&')  {symboleP = 2;return;}
            else if (c == '<')  {symboleP = 3;return;}
            else if (c == '>')  {symboleP = 4;return;}
            else if (c == '|')  {symboleP = 5;return;}
            else if (c == EOF)  {symboleP = 7;return;}
            else if (c != ' ') {
                symboleP = 10;
                while(c != '\n' && !strchr(delimiteurs,c)){
                    i=0;
                    while(c != 32 ){
                        if((c != '\n') && !strchr(delimiteurs,c)){
                        mot[i]=c;i++;
                        c=getchar();
                        }
                        else {break;}
                    }
                    break;
                }
                while(c == ' ')
                {
                    c=getchar();
                }
                ungetc(c,stdin);
                mot[i]=0;
                respP[cmot++]=strdup(mot);
                fflush(stdout);
                if(c == '\n' || strchr(delimiteurs,c))
                {
                    respP[cmot]=0;
                    return;
                }
            }
        }
     
    }
    A partir de là il y a ma fonction commande à laquelle j'ai retiré les variables pour rendre le code plus léger

    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
     
    void commande () {
        while(1){
            if(execute==1){
                if(symboleP==0){
                    printf("mySHELL> ");
                }    
                for (j=0;j<10;j++){
                    respP[j]=NULL;
                }            
                execute=0;    
                background=0;
            }
            fflush(stdout);
            parsing();
            switch (symboleP) { // varialbes initialiser par le parsing
                case 0 :                            // SYMBOLE : \n
                    p=fork();
     
                    if(p==0){                    //fils
                        if(tube==1){//printf("\n\n\n");
                                  fich = open("fichtmp",O_RDONLY,0640);
                            close(0); //fermeture clavier
                            dup(fich); //fichier devient entrée 0
                            execvp(respP[0], respP);
                            close(fich); //fermeture fichier
                              }
                              else if(output==0 && input==0){        //pas de redirection
                              printf("truc1");
                            execvp(respP[0], respP);
                              }
    ... other code over there ask me if needed ...
    A partir d'ici le pipe ne marche pas...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    mySHELL> mySHELL> ls | pwd
    /users/tony12
    Ca ne montre pas commande, avez-vous une idée de comment faire pour faire fonctionner les pipe?

  2. #2
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 283
    Par défaut
    Bonjour

    A partir d'ici le pipe ne marche pas...
    A quoi le vois-tu ?

    ls | pwd
    pwd ne prend aucun argument. Donc le pipe n'a aucun intérêt. Que cherches-tu à montrer ?

  3. #3
    Membre confirmé
    Homme Profil pro
    Etudiant
    Inscrit en
    Novembre 2015
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 156
    Par défaut
    Bonsoir!

    Je l'ai vu au fait que ls n'était pas renvoyé, uniquement mon working directory (dont le nom, je n'ai plus la souvenance!)

    Je cherchais à montrer que le pipe marchait à partir de mon shell...

  4. #4
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 283
    Par défaut
    Tu n'as pas compris ce qu'est un pipe.

    Examine le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ls >temp_file
    cat temp_file
    rm -f temp_file
    Ce code est équivalent à:
    C'est-à-dire que la sortie est considérée comme fichier, fichier d'entrée de la commande suivante. Le pipe évite la création d'un fichier temporaire.

    Ainsi, les commandes peuvent se passer un texte dans ce qu'on appelle une conduite:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat mon_fichier.txt | grep motif | sed 's/..NUL..//g' | sort -n -k1 | awk -F';' '{print $1;}' | less
    C'est le même texte qui subit les transformations successives.

    Comme il a déjà été indiqué, pwd ne prend pas de texte en argument !!!
    Donc tu peux bien mettre tous les fichiers que tu veux en entrée, il s'en moque.
    Il n'y a aucune chance que ton ls ressorte de ta commande.

  5. #5
    Membre confirmé
    Homme Profil pro
    Etudiant
    Inscrit en
    Novembre 2015
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 156
    Par défaut
    D'accord, je pense que j'ai dû confondre avec le ;
    Merci!

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

Discussions similaires

  1. Créer sa balise if dans son formulaire
    Par yepos dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 27/03/2010, 19h53
  2. Réponses: 5
    Dernier message: 02/02/2010, 09h54
  3. Réponses: 9
    Dernier message: 05/12/2007, 11h34
  4. Comment insérer la recherche google dans son site ?
    Par freud dans le forum Services
    Réponses: 4
    Dernier message: 02/07/2005, 08h51

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