This is an old revision of the document!
Le but de ce thème est de créer un shell simple, compatible avec sh
;
open
, read
, write
, …) fork
, exec
et 'waitpid' ', …) system ()
, auquel cas il ne sera pas en pointillé).Le thème est résolu individuellement. Toute tentative de copie entraînera 0p pour ce thème. Nous utiliserons également des systèmes de détection de copie automatique. Si nous avons des doutes, nous vous poserons des questions supplémentaires sur le sujet.
Si vous avez des questions sur le sujet, écrivez un problème sur le référentiel github repository avec le titre [mini-shell ] <le titre de votre question>. Vous avez besoin d'un compte github pour écrire des questions.
Si vous souhaitez recevoir un courrier électronique lorsque de nouvelles questions sont posées ou lorsque des réponses sont fournies, accédez à github repository et cliquez sur Regarder .
Implémentez un shell simple qui prend en charge l'exécution de commandes externes avec plusieurs arguments, commandes internes, redirections, canaux. Shell doit gérer l'exécution de commandes composées avec autant d'opérateurs.
cd
, pwd
, exit
…
Commandes externes: Les commandes qui sont réellement exécutables sont séparées: ls
, vim
, arbre
, nano
, …
La règle est la suivante: vérifiez si la commande interne est, sinon, supposée être une commande externe.
Shell doit prendre en charge les opérateurs d'exécution suivants:
;
expr1; expr2
commencera par exécuter les commandes expr1
et les commandes expr2
après leur exécution; &
expr1 & expr2
entraînera l'exécution de expr1
et des commandes expr2
en parallèle;execv ("./ my_homework", "command");
&&
et ||
expr1 && expr2
n'exécutera les commandes expr2
que si la commande expr1
génère un code d'erreur '0' '; expr1 || expr2
n'exécutera les commandes expr2
que si les commandes expr1
génèrent un code d'erreur différent de zéro. |
est interpolé entre deux commandes. L'effet redirige ce que le premier processus dit à l'écran
à ce qui lit à partir du deuxième clavier de processus. Par exemple, expr1 | expr2
entraînera l'exécution des commandes expr1
avec la sortie standard redirigée vers le stdin des commandes expr2
;
La priorité des opérateurs d'exécution est, de la priorité la plus haute à la moins priorité:
Shell doit également prendre en charge les redirecteurs suivants:
<nomfichier>
pour rediriger l'entrée standard à partir du fichier nomfichier
;> nomfichier
pour rediriger la sortie standard vers le fichier nomfichier
; 2> nom_fichier
pour rediriger la sortie d'erreur par défaut vers le fichier nomfichier
;& &> filename
pour rediriger la sortie standard et la sortie d'erreur standard vers le fichier filename
; >> nom_fichier
pour rediriger la sortie standard vers le fichier nomfichier
dans append mode; 2 >> fichier_fichier
pour rediriger la sortie d'erreur par défaut vers le fichier nom_fichier
en mode append .Enfin, le shell doit prendre en charge les commandes internes suivantes:
exit
et quit
pour finir la coque cd directory
pour changer le répertoire actuel cd
sans paramètre. Il n'est pas nécessaire d'implémenter le comportement de 'bash' '(changer le répertoire en cours avec répertoire en cours répertoire de l'utilisateur en cours) et aucune valeur de sortie pour ce scénario (en gros,' 'cd' 'sans paramètre ne peut rien faire , mais ne restez pas indéfini pour conduire à des erreurs).Shell doit supporter les variables d'environnement:
$ VARIABILA_DE_MEDIU
identique sous Linux et Windows NUME_VARIABILA = valeur
CUseParser.c
. mini-shell
.Le thème est relativement complexe par rapport au précédent. Un modèle d'initiation de thème est disponible à l'adresse repository dans le répertoire tema3 . Nous vous recommandons de résoudre et de tester de près le sol, étape par étape:
ls
, ls -l
) cd
, exit
, 'quit' ') <',' ',' ',' ',' ','
,
>> , %
)&&
, ||
, ;
) &
(parallèle) |
$ ls Makefile README.checker mini-shell mini-shell.o parser Makefile.checker inputs mini-shell.c outputs tags $ cat /etc/services | grep telnet telnet 23/tcp rtelnet 107/tcp # Remote Telnet rtelnet 107/udp telnets 992/tcp # Telnet over SSL telnets 992/udp tfido 60177/tcp # fidonet EMSI over telnet $ uname -a ; ps Linux bogdan-desktop 2.6.31-19-generic #56-Ubuntu SMP Thu Jan 28 02:39:34 UTC 2010 x86_64 GNU/Linux PID TTY TIME CMD 6078 pts/0 00:00:00 bash 6190 pts/0 00:00:00 mini-shell 6200 pts/0 00:00:00 ps $ date && sleep 1 ; echo date Mon Feb 8 13:40:25 EET 2010 date $ date && sleep 1; date Mon Feb 8 13:40:49 EET 2010 Mon Feb 8 13:40:50 EET 2010 $ true && date Mon Feb 8 13:41:16 EET 2010 $ false && cat mini-shell.c $ false || date Mon Feb 8 13:42:36 EET 2010 $ cat /et/services cat: /et/services: No such file or directory $ gcc > tmp; echo sep; cat tmp gcc: no input files sep $ strace -e trace=read ls 2> strace.out Makefile README.checker mini-shell mini-shell.o parser tags Makefile.checker inputs mini-shell.c outputs strace.out tmp $ head -1 strace.out read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@#\0\0\0\0\0\0@"..., 832) = 832 $ pwd; cd Teme; pwd /home/bogdan/Documents/SO/Solutii /home/bogdan/Documents/SO/Solutii/Teme $ LETTER=alfa && echo $LETTER alfa > echo a > test ; echo b >> test && cat test a b > exit
Cours utiles:
Laboratoires utiles:
Ressources:
Pour exécuter des lignes de commande, nous avons déjà écrit un analyseur que vous pouvez utiliser. Lancez le thème dans le fichier 'cmd.c' du modèle.
Pour afficher à quoi ressemble la structure de données à partir de l'analyseur, utilisez ce qui suit:
make DisplayStructure # Compileaza DisplayStructure ./DisplayStructure # ruleaza DisplayStructure # exemplu de comanda simpla # op este OP_NONE iar scmd are un pointer catre o structura simple_command_t # comanda este in cmd->scmd->verb (acesta este un string) $ ls ls Command successfully read! command_t ( op == OP_NONE scmd ( simple_command_t ( verb ( 'ls' ) ) ) ) # idem cu comanda de mai sus, doar ca exista si parametrii (array de string-uri) $ ls -l ls -l Command successfully read! command_t ( op == OP_NONE scmd ( simple_command_t ( verb ( 'ls' ) params ( '-l' ) ) ) ) # idem cu mai sus, insa cu doi parametrii $ ls -r -l ls -r -l Command successfully read! command_t ( op == OP_NONE scmd ( simple_command_t ( verb ( 'ls' ) params ( '-r' '-l' ) ) ) ) # doua comanezi inlantuite $ ls ; ls /etc ls ; ls /etc Command successfully read! command_t ( op == OP_SEQUENTIAL cmd1 ( command_t ( op == OP_NONE scmd ( simple_command_t ( verb ( 'ls' ) ) ) ) ) cmd2 ( command_t ( op == OP_NONE scmd ( simple_command_t ( verb ( 'ls' ) params ( '/etc' ) ) ) ) ) )
a | b | c
, j'ai 3 fourchettes ou puis-je en avoir 4 ou 5? $ OLDPWD
et $ PWD
), historique, etc. - (voir man bash pour une idée de la fonctionnalité d'un shell complet )const char *argv[] = {"/bin/bash", "-c", command, NULL}; execv("/bin/bash", (char *const *)argv);
* A: Non.
execv
sur mon thème pour exécuter une partie de l'arbre indépendant?Le thème se chargera sur vmchecker. Connectez-vous au site à l'aide de l'utilisateur moodle, sélectionnez Systemes d'Explotation (FILS) et chargez archive de thèmes.
Le fichier lisez-moi a le format suivant:
Votre nom entier groupe Description de la résolution du problème, pourquoi vous avez choisi des solutions, etc.
Pour charger le thème, suivez les étapes suivantes:
N'incluez PAS les fichiers objets (* .o) et l'exécutable. (Astuce: utilisez make clean pour les supprimer avant d’archiver le thème)
Après avoir chargé l'archive, vmchecker s'exécutera:
unzip archive.zip homework cd homework make build make run