Programmation shell en c

Fermé
black shakur - 13 sept. 2007 à 16:19
 Kmr - 18 mars 2008 à 08:47
bonjour a tous

en fait je suis etudiante en informatique en 1ere annee.

jai un probleme par rapport a un projet kon nous a donner.
Partie 1 > on nous a demande de faire un projet ki est un minishell ki
gere toute les commandes du systeme ansi kun prompt en bref un shell vraiment basic : j'ai reussi avec beaucoup de difficulté mais ca marche :D
Partie 2 > on doit aussi geré le separateur(;) les redirections (>,>>,<<,<) et le pipes (|) mais la je calle un peu, non en fait je n'avance pas.
c'est pour cela k je sollicite votre aide, si je pouvais avoir un petit coup de pouce ,une direction ,ca serait sympa!!
{systeme unix}
merci
A voir également:

3 réponses

passe moi le code de la premiere partie
1
Bonjour,

Je n'ai peut-être pas compris ton problème... mais pour moi, il suffit de récupèrer la commande saisie, et de l'exécuter via 'system'.

Si tu saisis " echo pwet > test ", alors tu va appeler system("echo pwet > test")

Je ne comprend pas ce qui est différent, avec ou sans redirection, ou avec ou sans pipes, ou séparateurs....

Mais peut-être vas-tu m'expliquer celà :)

Bonne journée!
0
black shakur
13 sept. 2007 à 19:25
bonjour marc

j pense k pour que se sera plus simple :

PARTIE 1 (k j'ai deja realiser)

Description Vous devez programmer un mini interpreteur de commande UN*X.
Cet interpreteur doit afficher un prompt (un simple "$> " par exemple) et attendre que vous tappiez une ligne de commande, validee par un retour a la ligne.
Le prompt n'est de nouveau affiche qu'apres la fin de l'execution de la commande.
Les lignes de commandes sont simples, pas de pipes, pas de redirections ou autres fonctions avancés.
Par exemple :

$> pwd
/dev
$> ls -l
total 0
crw-rw---- 1 root video 10, 175 dec 19 09:50 agpgart
lrwxrwxrwx 1 root root 3 dec 19 09:50 cdrom -> hdc
lrwxrwxrwx 1 root root 3 dec 19 09:50 cdrom0 -> hdc
drwxr-xr-x 2 root root 60 dec 19 09:50 cdroms/
lrwxrwxrwx 1 root root 3 dec 19 09:50 cdrw -> hdc
lrwxrwxrwx 1 root root 11 dec 19 09:50 core -> /proc/kcore
drwxr-xr-x 3 root root 60 dec 19 09:50 cpu/
drwxr-xr-x 3 root root 60 dec 19 09:50 discs/
lrwxrwxrwx 1 root root 3 dec 19 09:50 disk -> hda
lrwxrwxrwx 1 root root 3 dec 19 09:50 dvd -> hdc
lrwxrwxrwx 1 root root 3 dec 19 09:50 dvdrw -> hdc
crw------- 1 root root 29, 0 dec 19 09:50 fb0
lrwxrwxrwx 1 root root 13 dec 19 09:50 fd -> /proc/self/fd/
brw-rw---- 1 root floppy 2, 0 dec 19 09:50 fd0
brw-rw---- 1 root floppy 2, 1 dec 19 09:50 fd1
crw-rw-rw- 1 root root 1, 7 dec 19 09:50 full
brw-rw---- 1 root root 3, 0 dec 19 09:50 hda
brw-rw---- 1 root root 3, 1 dec 19 09:50 hda1
brw-rw---- 1 root root 3, 2 dec 19 09:50 hda2
brw-rw---- 1 root root 3, 3 dec 19 09:50 hda3
brw-rw---- 1 root root 3, 5 dec 19 09:50 hda5
brw-rw---- 1 root root 3, 6 dec 19 09:50 hda6
$> toto
toto: command not found
$>

Les executables sont ceux que l'on peut trouver dans les chemins indiqué dans la variable PATH. Dans le cas ou celui ci ne peut etre trouvé, il faut afficher un message d'erreur et reafficher le prompt.
# Vous devez gerer les erreurs sans utiliser errno, en affichant un message adapte sur la sortie d'erreur.

# Vous devez gerer correctement le PATH et l'environnement (copie du char **environ systeme).

# De plus vous devez implementer une serie de builtins : cd, setenv, unsetenv, env, exit.

Fonctions authorisées malloc, free, opendir, readdir, closedir, exit
Appels système authorisés chdir, fork, stat, lstat, fstat, open, read, write, execve, access, wait, waitpid, wait3, wait4, signal, kill

PARTIE 2 :(voici mon probleme)


Il s'agit de reprendre votre minishell1, et d'y integrer les ';',
les pipe '|' et les 4 redirections '>', '<', '>>' et '<<'.
Vous devez utiliser execve(2) (et non execvp) comme pour le minishell1.

prompt>ls | more >> /tmp/toto ; cd /tmp ; cat < toto
[...]

Foctions interdites: -popen(3), pclose(3)

Les aggregations de filedescriptors (genre sortie d'erreur) sont en bonus.
(Vous savez, cat toto >& /tmp/titi en tcsh ou bien cat toto > /tmp/titi 2>&1 en sh)


EN FAIT ON DOIT RECODER UN SHELL A L'AIDE DE NOS PROPRES FONCTION ET NOS PROPRES PROGRAMME
DONC TOUT EST A REFAIRE ET TOUT EST A GERER.
POUR L'EXECUTION DES COMMANDES DU SYSTEME COMME LS PAR EXEMPLE JE ME SUIS AIDER DE L'APPEL A EXECVE
EN TOUT CAS LA PREMIERE PARTI MARCHE
ET JE VOUDRAI SAVOIR COMMENT FAIRE POUR GERER LES SEPARATEURS LES REDIRECTION ET LES PIPES

MERCI ENCORE EN ESPERANT K TU CONMPRENNE MES EXPLICATIONS
0