Programmation d'un shell sous Linux

Statut
N'est pas ouverte pour d'autres réponses.
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.
 

LebecK

Elite
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
 
1er
OP
TITM4v3rick
LebecK a dit:
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
: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 ;)
 

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--;
}
 
1er
OP
TITM4v3rick
k@ra il a pe des liens, quoi que :) :D
 

titloup

Elite
Je pense que c'était le SHELL de Codutti, je ne sais plus :D
 
1er
OP
TITM4v3rick
1v0 - WOLF a dit:
Je pense que c'était le SHELL de Codutti, je ne sais plus :D
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...
 

titloup

Elite
TITM4v3rick a dit:
1v0 - WOLF a dit:
Je pense que c'était le SHELL de Codutti, je ne sais plus :D
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...
Ben suffit de bien connaitre son cours, et t'auras pas de problémes... :roll:
 

titloup

Elite
TITM4v3rick a dit:
Yaka... mouais
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
 
1er
OP
TITM4v3rick
1v0 - WOLF a dit:
TITM4v3rick a dit:
Yaka... mouais
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

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.
 

baze

Touriste
des gens de l E.S.I. on dirait ...
 

Tuur

Fan(t)a(s)tique
oula ca me fait peur tt ca....
degoutez moi pas...
 
G

Guest

ex membre
fonctionnement d'un OS > "The Design and Implementation of the 4.4 BSD Operating System", aux éditions Addison Wesley
 

Loki

Insane God
c'est quand même cool le mois de juin sans exam.. :wink:

Allez bonne m**** :D








oki :arrow:
 
Statut
N'est pas ouverte pour d'autres réponses.
Haut