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 créer son propre shell?


Sujet :

Linux

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

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 156
    Points : 52
    Points
    52
    Par défaut Comment créer son propre shell?
    Bonsoir!

    J'ai actuellement le projet de créer mon propre shell et j'ai commencé à me renseigner et à faire un plan. J'ai aussi "emprunté" à un site ayant déjà réaliser ce projet une partie de son code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int main(int argc, char* argv[]) {
        while(1){
            if(execute==1){
                if(symbole==0){
                    printf("DAUPHINE> ");
                }    
                for (j=0;j<10;j++){
                    eltsCommande[j]=NULL;
                }            
                execute=0;    
                bg=0;
            }
            fflush(stdout);
            parsing();

    Ici, eltsCommande[j] est il le tableau prenant sur 10 cases la commande passé? Pourquoi vouloir forcer le buffer à imprimer ce qu'il a l'intérieur si le tout est initialisé à NULL?

    Le programme fait ensuite appelle à la fonction de parsing qui va lire les caractères. Je ne la donne pas en entier d'abord pour essayer de concentrer mes efforts de compréhension sur ce qui est utile est ensuite parce que je souhaite comprendre pas à pas comment fonctionne un shell.

    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
    int parsing(){
        int i=0;
        int cmot=0;
        while(1){
            c = getchar();
            if      (c == '\n') {symbole = 0;return 0;}
            else if (c == ';')  {symbole = 1;return 1;}
            else if (c == '&')  {symbole = 2;return 2;}
            else if (c == '<')  {symbole = 3;return 3;}
            else if (c == '>')  {symbole = 4;return 4;}
            else if (c == '|')  {symbole = 5;return 5;}
            else if (c == EOF)  {symbole = 7;return 7;}
            else if (c != ' ') {
                symbole = 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;
                eltsCommande[cmot++]=strdup(mot);
                fflush(stdout);
                if(c == '\n' || strchr(delimiteurs,c))
                {
                    eltsCommande[cmot]=0;
                    return;
                }
            }
        }
     
    }
    Ici je ne comprends absolument pas la fonction de cette ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
               while(c != '\n' && !strchr(delimiteurs,c)){
                    i=0;
                    while(c != 32 ){
                        if((c != '\n') && !strchr(delimiteurs,c)){
    c peut il jamais être égal à 32?

    Pourquoi met on deux fois une condition sur f((c != '\n') && !strchr(delimiteurs,c))?

  2. #2
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    Citation Envoyé par AntoineCompagnie Voir le message
    Ici, eltsCommande[j] est il le tableau prenant sur 10 cases la commande passé? Pourquoi vouloir forcer le buffer à imprimer ce qu'il a l'intérieur si le tout est initialisé à NULL?
    ça peut être un tableau de non pas 10 caractères pour stocker 1 commande, mais plutot 10 chaines de caractères pour pouvoir stocker la ligne de commandes complète, ça aurait même plus de sens étant donné l'affectation vers NULL au lieu de 0, en revanche j'ai pas compris la deuxième partie de ta question

    c peut il jamais être égal à 32?
    oui (cf la table ASCII), le code 32 en décimal (ou 0x20 en hexadecimal) correspond simplement à un espace, entre les éléments de la commande donc, ça tend à se confirmer

    Pourquoi met on deux fois une condition sur f((c != '\n') && !strchr(delimiteurs,c))?
    je vois pas trop ce que tu veux dire là non plus, mais le code n'est pas forcément très habile non plus, si il fait le job c'est déjà bien manifestement

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

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 156
    Points : 52
    Points
    52
    Par défaut
    D'accord! Merci beaucoup, je comprends mieux!

    Pour la deuxième partie de la questuion, j'avais mal compris comment marchait flush, donc pas de problème à priori!

    par contre aurait on pu remplacer:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(c != '\n' && !strchr(delimiteurs,c)
    par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(c != '\n' && strchr(delimiteurs,c) == NULL
    Un ami a essayé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(c != '\n' && !strchr(delimiteurs,c) == 0
    Mais je lui ait dit que je ne voyais pas l’intérêt et que c'était sûrement une erreur...

  4. #4
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    while(c != '\n' && !strchr(delimiteurs,c)) c'est l'équivalent de while(c != '\n' && strchr(delimiteurs,c) == 0)
    Code d'exemple : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	for (i = -2; i <= 2; i++) {
    		if (i) printf ("%2d : true\n");
    		else printf ("%2d : false\n");
    	}
    
    -2 : true
    -1 : true
     0 : false
     1 : true
     2 : true

Discussions similaires

  1. Réponses: 14
    Dernier message: 15/01/2014, 15h37
  2. Comment créer son propre Widget Gtkmm?
    Par Greensource dans le forum GTK+ avec C & C++
    Réponses: 2
    Dernier message: 08/04/2009, 11h41
  3. Comment créer son propre logo ?
    Par jojo_ol76 dans le forum Imagerie
    Réponses: 7
    Dernier message: 15/01/2008, 15h03
  4. Comment créer son propre iterator ?
    Par kidpaddle2 dans le forum C++
    Réponses: 9
    Dernier message: 02/04/2007, 22h02
  5. Comment créer son propre logiciel de gestion ?
    Par Sayanne dans le forum Autres Logiciels
    Réponses: 8
    Dernier message: 11/04/2006, 18h03

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