Programmation d'un shell sous Linux

Discussion dans 'Windows' créé par TITM4v3rick, 17 Juin 2003.

Statut de la discussion:
Fermée.
  1. Offline
    Bonjour,




    Actuellement je suis à la recherche d'informations sur la programmation Linux, et plus précisément le fait de créer un shell en langage C.
    Utilisation d'instructions fork(); wait(); dup2();...


    Alors si vous avez des sites intéressant à ce sujet, des exemples ou encore des explications sur le fonctionnement d'un système d'exploitation (là je parle au niveau table de processus, fonctionnement d'un ordonnenceur, registres ... Je n'ai pas besoin de réponses nawak de gamins qui utilisent Windows depuis 2 ans et qui pensent savoir ce qu'est un OS) et l'utilisation du shell linux; je suis preneur.




    merci d'avance.
    TITM4v3rick, 17 Juin 2003
    #1
  2. Offline
    LebecK Touriste
    heuu spychopat spotted
    j avais bien un cour de prog c sous linux cet année mais pour t aider j aurais mieux fais d'y aller ..
    bien venu SEPTEMBREEEEEEEEEEEEEEEE
    LebecK, 17 Juin 2003
    #2
  3. Offline
    :D toi aussi... Enfin moi g été à presque tout en théorie, g les pages... du blabla condensé qui ne veut pas dire bcp de choses.


    Les labos, ben on avait droit à qlq heures pour utiliser le shell, puis pour faire des essais avec les fonctions fork, wait, dup2...
    et enfin deux heures pour faire un shell (qui est inachevé; sans dec...)

    Linux, enfin Unix parce que c plus jouer avec la console, le man et l'éditeur vi; c'est un monde à part... Moi j'm bien mon C++ sous Builder ;)
    TITM4v3rick, 17 Juin 2003
    #3
  4. Offline
    titloup Elite
    Code:
    /* Quatrième version du shell yash    */
    /* Tient compte du & final            */
    /* Tient compte des redirections <, > */
    /* Tient compte des pipes             */
    
    #include <fcntl.h>
    
    char cmd[100];   /* La commande lue */
    int  cmdlg;      /* sa taille */
    char *targs[20]; /* Les éléments de la commande */
    int  nb;         /* Nb d'éléments dans la commande */
    char **args;     /* Pointeur de travail vers args */
    char *prompt="Commande: ";
    int  batch;      /* indique si on est en mode batch */
    int  tube[2];    /* tube pour la présence du | */
    int  status;
    
    /* Rien de changé */
    main()
    {
            while(1)
            {
                    readcmd();  
       if( strncmp(cmd,"exit",cmdlg)==0 ) exit(0);
                    decoderCommande();
                    if (nb>0)
                    {
                            traiterBatch();
                            executerCommande();
                    }
            }
            exit(1);
    }
    
    /* Rien de changé */
    readcmd()
    {
            write(1,prompt,strlen(prompt));
            cmdlg = read(0,cmd,100);
            cmd[cmdlg-1]=0;
    }
    
    /* Rien de changé */
    /* si ce n'est que targs et args pointent vers les élements */
    decoderCommande()
    {
       char *p = cmd;
            char *c,*t;
    
            nb = 0;
            while (*p != '\0')
            {
                    c = p;
                    while (*c!=' ' && *c !='\0') c++;
                    /* copier string */
                    targs[nb] = (char *) malloc(c-p+1);
                    t = targs[nb];
                    for (;p!=c;) *(t++) = *(p++);
                    *t = '\0';
                    nb++;
                    /* Passer les blancs */
                    while (*p==' ') p++;
            }
            if (nb==0) return(1);
            targs[nb] = 0;
            args = targs;
    }
    traiterBatch()
    {
            if (strcmp(*(args+nb-1),"&")==0) {
                    batch = 1;
                    nb--;
                    *(args+nb) = 0;
            }
            else
                    batch = 0;
    }
    
    traiterRedirection()
    {
            int i,fd;
    
            /* Examiner chaque argument */
            for (i=1; i<nb; i++)
            {
                    /* Est-ce qu'il commence par < */
                    if (**(args+i)=='<')
                    {
                            fd = open( *(args+i)+1, O_RDONLY );
                            if (fd==-1)
              printf("%s n'existe pas.\n", *(args+i)+1);
                            suppressArg(i);
                            close(0);
                            dup(fd);
                            close(fd);
                    }
                    /* Est-ce qu'il commence par > */
                    if (**(args+i)=='>')
                    {
                            fd = creat( *(args+i)+1, 0666 );
                            if (fd==-1)
                                printf("impossible de créer %s\n", *(args+i)+1);
                            suppressArg(i);
                            close(1);
                            dup(fd);
                            close(fd);
                    }
            }
    }
    
    executerCommande()
    {
            int pid;    
     int res;
    
            pid = fork();
            if (pid==0)
                    executerCommande2();
            if (!batch)
                    pid = wait(&res);
    }
    
    executerCommande2()
    {
            int pid;
            int pospipe;
    
            /* tester Pipe */
            pospipe = traiterPipe();
            if (pospipe<nb)
            {
                    /* Pipe */
                    status = pipe(tube);
                    pid = fork();
                    if (pid==0)
                    {
                 /* Fils : execute la premier partie de la commande */
                            /* Rediriger la sortie */
                            close(1);
                            dup(tube[1]);
                            /* Fermer les descripteurs inutiles */
                            close(tube[0]);
                            close(tube[1]);
                            /* Lancer la commande */
                            execvp( *args, args );
                            printf("Impossible d'exécuter : %s\n",*args);
                    }
                    /* Pere : executer 2eme commande */
                    /* Rediriger l'entree */
                    close(0);
                    dup(tube[0]);
                    /* Fermer les descripteurs inutiles */
                    close(tube[0]);
                    close(tube[1]);
                    /* Recursion: Car il est possible qu'il y aie plusieurs | */
                    /* dans la meme commande */
                    /* On se positionne a la commande suivante et appel recursif */
                    args = args + pospipe + 1;
                    nb   = nb - pospipe - 1;
              executerCommande2();
            }
            else
            {
                    /* Pas de pipe */
                    traiterRedirection();
                    execvp( *args, args );
                    printf("Impossible d'exécuter : %s\n",*args);
            }
    }
    
    /* Cherche et renvoie la position de | */
    /* Si pas trouve -> renvoie nb, nb d'éléments */
    int traiterPipe()
    {
            int i;
    
            /* Chercher | */
            for (i=0; i<nb; i++)
            {
                    if(**(args+i)=='|')
                    {
                            *(args+i) = 0;
              return(i);
                    }
            }
            return(nb);
    }
    
    /* Supprime l'élément i */
    suppressArg(int n)
    {
            int i;
            for (i=n; i<nb; i++)
            {
                    *(args+i) = *(args+i+1);
            }
            nb--;
    }                     
    titloup, 17 Juin 2003
    #4
  5. Offline
    k@ra il a pe des liens, quoi que :) :D
    TITM4v3rick, 17 Juin 2003
    #5
  6. Offline
    titloup Elite
    Je pense que c'était le SHELL de Codutti, je ne sais plus :D
    titloup, 17 Juin 2003
    #6
  7. Offline
    TITM4v3rick, 17 Juin 2003
    #7
  8. Offline
    petit con :D
    Mais moi c Jaumain qui me fait peur, c'est lui qui va mettre le pot de vaseline sur le coin de la table...
    TITM4v3rick, 17 Juin 2003
    #8
  9. Offline
    titloup Elite
    Ben suffit de bien connaitre son cours, et t'auras pas de problémes... :roll:
    titloup, 17 Juin 2003
    #9
  10. Offline
    Yaka... mouais
    TITM4v3rick, 17 Juin 2003
    #10
  11. Offline
    titloup Elite
    C'est sûr... si c'est oral... et qu'il voit que tu connais bien ton cours... t'auras pas de problémes... par contre, si tu ne connais rien... alors là... bijour la 2éme sess :D
    titloup, 17 Juin 2003
    #11
  12. Offline

    Ben le problème n'est pas de connaître mais de maîtriser...
    Je sent qu'il va venir avec des petites questions sournoises, genre :

    Le multitâche c'est quoi !? Et quoi tu fais tourner plusieurs processus en même temps ? Pourquoi il a choisit tel processus ton ordonnenceur ? Comment ça fonctionne tes interruptions, quoi c'est logiciel, c'est matériel ? le SE c'est quoi ? un pgm, un processus, les 2, mieux encore ?
    Expliques moi un peu l'IP... et comme des comme ça, yen à des centaines.
    TITM4v3rick, 17 Juin 2003
    #12
  13. Offline
    baze Touriste
    des gens de l E.S.I. on dirait ...
    baze, 17 Juin 2003
    #13
  14. Offline
    Tuur Fan(t)a(s)tique
    oula ca me fait peur tt ca....
    degoutez moi pas...
    Tuur, 17 Juin 2003
    #14
  15. Offline
    guslinux Gamerz'ien
    guslinux, 17 Juin 2003
    #15
  16. Offline
    Guest ex membre
    fonctionnement d'un OS > "The Design and Implementation of the 4.4 BSD Operating System", aux éditions Addison Wesley
    Guest, 17 Juin 2003
    #16
  17. Offline
    Loki Insane God
    c'est quand même cool le mois de juin sans exam.. :wink:

    Allez bonne m**** :D








    oki :arrow:
    Loki, 17 Juin 2003
    #17
Statut de la discussion:
Fermée.