This shows you the differences between two versions of the page.
sde:teme:tema_fr_3 [2019/03/20 18:45] alexandru.radovici [Soumettez le thème] |
— (current) | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Devoir 3 - Mini-shell ====== | ||
- | |||
- | Le but de ce thème est de créer un shell simple, compatible avec '' sh ''; | ||
- | |||
- | ===== Informations générales ===== | ||
- | |||
- | <note important> | ||
- | Date limite: ** Le 31 mars, 23h55 ** \\ | ||
- | Note: ** 2 points ** de la note \\ | ||
- | Téléchargement du devoir: [[https://vmchecker.cs.pub.ro|vmchecker.cs.pub.ro]] \\ | ||
- | Charge différée: ** 0.1 point / jour ** (max 4 jours) \\ | ||
- | </note> | ||
- | |||
- | ===== Connaissances précieuses ===== | ||
- | |||
- | * Utiliser les fonctions POSIX pour travailler avec des fichiers ('' open '', '' read '', '' write '', ...) | ||
- | * Utiliser les fonctions pour travailler avec des processus ('' fork '', '' exec '' et 'waitpid' ', ...) | ||
- | * Comprendre les principes de travail avec les fichiers et les processus | ||
- | |||
- | ===== Règles ===== | ||
- | |||
- | - Le code source doit être mis en retrait (-0.1p) | ||
- | - Le thème doit contenir un fichier Lisez-moi expliquant comment vous avez créé le thème (-0.1p) | ||
- | - Le thème ne vous oblige pas à avoir des fuites de mémoire (-0.5p) | ||
- | - Vous êtes uniquement autorisé à utiliser les fonctions POSIX | ||
- | - Avetu est autorisé à utiliser uniquement le langage C | ||
- | - Un thème qui passe tous les tests automatisés obtiendra 10 sur 10 (s'il ne triche pas en utilisant l'API interdite, telle que la fonction '' system () '', auquel cas il ne sera pas en pointillé). | ||
- | |||
- | |||
- | ===== Copier ===== | ||
- | |||
- | 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. | ||
- | |||
- | ===== Questions ===== | ||
- | |||
- | Si vous avez des questions sur le sujet, écrivez un problème sur le référentiel github [[https://github.com/upb-fils/sde.git|repository]] avec le titre [mini-shell ] <le titre de votre question>. Vous avez besoin d'un compte github pour écrire des questions. | ||
- | |||
- | <note warning> | ||
- | ** NE PAS PUBLIER LA SOURCE DU CODE **. Ce sera considéré comme une copie et sera pénalisé avec 0p sur le thème pour vous. | ||
- | </note> | ||
- | |||
- | Si vous souhaitez recevoir un courrier électronique lorsque de nouvelles questions sont posées ou lorsque des réponses sont fournies, accédez à github [[https://github.com/upb-fils/sde|repository]] et cliquez sur // Regarder //. | ||
- | |||
- | ===== Mini Shell ===== | ||
- | |||
- | 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. | ||
- | |||
- | <note> | ||
- | Commnets internes: commandes que le shell exécute: '' 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. | ||
- | </note> | ||
- | |||
- | Shell doit prendre en charge les opérateurs d'exécution suivants: | ||
- | |||
- | * Opérateur de séquençage ''; '' | ||
- | * sera utilisé pour exécuter des commandes "dans une rangée"; | ||
- | * par exemple, '' expr1; expr2 '' commencera par exécuter les commandes '' expr1 '' et les commandes '' expr2 '' après leur exécution; | ||
- | * Opérateur de parallélisme '' & '' | ||
- | * sera utilisé pour exécuter les commandes en parallèle; | ||
- | * par exemple, '' expr1 & expr2 '' entraînera l'exécution de '' expr1 '' et des commandes '' expr2 '' en parallèle; | ||
- | * en cours de réalisation ** NON ** Vous êtes autorisé à rappeler vous-même votre exécutable. <code> execv ("./ my_homework", "command"); </code> | ||
- | * opérateurs d'exécution conditionnelle '' && '' et '' || '' | ||
- | * sera utilisé pour exécuter des commandes en fonction du code d'erreur; | ||
- | * '' 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. | ||
- | * l'opérateur de pipe '' | '' 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é: | ||
- | |||
- | - opérateur de pipe | ||
- | - opérateurs d'exécution conditionnelle | ||
- | - l'opérateur de parallélisme | ||
- | - Opérateur de séquençage | ||
- | |||
- | 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 | ||
- | * ** ATTENTION **: Le mini-shell doit toujours fonctionner en entrant la commande '' 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: | ||
- | * Le format d'utilisation est '' $ VARIABILA_DE_MEDIU '' identique sous Linux et Windows | ||
- | * Les variables d'environnement sont héritées du shell parent (Bash) ou définies dans un mini-shell | ||
- | * La définition de la variable est sous la forme '' NUME_VARIABILA = valeur '' | ||
- | * doit également être traité si la 'valeur' contient des références à d'autres variables environnementales | ||
- | * si la variable d'environnement n'existe pas, elle a la valeur de chaîne vide (** Remarque ** la chaîne vide est différente de NULL) | ||
- | |||
- | ==== Remarques générales ==== | ||
- | |||
- | * Pour simplifier la mise en oeuvre du thème, vous pouvez utiliser la commande [# #Down Command | analyseur]] mis en œuvre par nous. Pour plus de détails sur l’analyseur, lisez le fichier README dans l’archive. Des exemples d'utilisation de l'analyseur peuvent être trouvés dans la source '' CUseParser.c ''. | ||
- | * L'invite affichée par le shell est requise pour faciliter les tests automatiques et est $ (c'est-à-dire qu'elle affichera le caractère $ suivi d'un espace). | ||
- | * Le nom de l'exécutable du thème doit être '' mini-shell ''. | ||
- | |||
- | ==== Suggestions à résoudre ==== | ||
- | Le thème est relativement complexe par rapport au précédent. Un modèle d'initiation de thème est disponible à l'adresse [[https://github.com/upb-fils/sde|repository]] dans le répertoire // tema3 //. | ||
- | Nous vous recommandons de résoudre et de tester de près le sol, étape par étape: | ||
- | |||
- | - Lancer des commandes simples ('' ls '', '' ls -l '') | ||
- | - Exécuter des commandes internes ('' cd '', '' exit '', 'quit' ') | ||
- | - mise en place de redirections (opérateurs '' <',' ',' ',' ',' ',' '' '', '' %% >> %% '', % '') | ||
- | - ordres de séquencement (opérateurs ''&&'', ''||'', '';'') | ||
- | - implémentation des opérateurs '' & '' (parallèle) | ||
- | - '' | '' | ||
- | |||
- | * Voici quelques exemples de commandes et le résultat généré par celles-ci: | ||
- | <code bash> | ||
- | $ 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</code> | ||
- | ===== Documents d'aide ===== | ||
- | Cours utiles: | ||
- | |||
- | *[[sde:cursuri:01]] | ||
- | *[[sde:cursuri:02]] | ||
- | *[[sde:cursuri:03]] | ||
- | *[[sde:cursuri:04]] | ||
- | *[[sde:cursuri:05]] | ||
- | Laboratoires utiles: | ||
- | |||
- | *[[sde:laboratoare:01]] | ||
- | *[[sde:laboratoare:02]] | ||
- | *[[sde:laboratoare:03]] | ||
- | *[[sde:laboratoare:04]] | ||
- | *[[sde:laboratoare:05]] | ||
- | Ressources: | ||
- | * L'analyseur de commandes, le modèle de code et les tests sont disponibles dans [[https: //github.com/upb-fils/sde/tree/master/tema3 | theme3]] of the [[https://github.com/upb-fils/sde|report on Github]]. | ||
- | |||
- | |||
- | ===== Exécution de lignes de commande ===== | ||
- | 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: | ||
- | <code bash> | ||
- | 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' | ||
- | ) | ||
- | ) | ||
- | ) | ||
- | ) | ||
- | ) | ||
- | ) | ||
- | |||
- | </code> | ||
- | ===== FAQ ===== | ||
- | |||
- | *** Q: ** Le thème 3 peut être réalisé en C ++? | ||
- | *** A: ** Non. | ||
- | |||
- | *** Q: ** Le nombre de fourches doit-il être optimisé? Par exemple, pour la commande '' a | b | c '', j'ai 3 fourchettes ou puis-je en avoir 4 ou 5? | ||
- | *** A: ** Il n'est pas nécessaire d'optimiser le nombre de fourches. Cependant, il est généralement conseillé de considérer l'efficacité des ressources plus efficacement. | ||
- | |||
- | *** Q: ** Shell doit se comporter comme un vrai shell (sh, bash) dans la situation ...? | ||
- | *** A: ** La fonctionnalité minimale requise est celle indiquée dans la déclaration. Si vous implémentez quelque chose de plus, veuillez spécifier dans le fichier README Exemples de fonctionnalités non requises: mise à jour des variables d’environnement (comme '' $ OLDPWD '' et '' $ PWD ''), historique, etc. - (voir [[http://linux.die.net / man / 1 / bash | man bash]] pour une idée de la fonctionnalité d'un shell complet :-)) | ||
- | |||
- | *** Q: ** Puis-je utiliser l'analyseur si je veux écrire un autre équivalent? | ||
- | *** A: ** Oui. | ||
- | |||
- | *** Q: ** Nous sommes autorisés à utiliser: | ||
- | <code> | ||
- | const char *argv[] = {"/bin/bash", "-c", command, NULL}; | ||
- | execv("/bin/bash", (char *const *)argv); | ||
- | </code> | ||
- | *** A: ** Non. | ||
- | |||
- | *** Q: ** Puis-je faire '' execv '' sur mon thème pour exécuter une partie de l'arbre indépendant? | ||
- | *** A: ** Non. | ||
- | |||
- | |||
- | ===== Télécharger les devoirs ===== | ||
- | Le devoir se chargera sur [[https: //vmchecker.cs.pub.ro | vmchecker]]. Connectez-vous au site à l'aide de l'utilisateur moodle, sélectionnez // Systemes d'Explotation (FILS) // et chargez [[#archive-devoir | archive de devoir]]. | ||
- | |||
- | ====Readme ==== | ||
- | Le fichier readme a le format suivant: | ||
- | |||
- | <code> | ||
- | Votre nom entier | ||
- | groupe | ||
- | |||
- | Description de la résolution du problème, pourquoi vous avez choisi des solutions, etc. | ||
- | </code> | ||
- | |||
- | |||
- | ==== Archive Archive ==== | ||
- | Pour charger le thème, suivez les étapes suivantes: | ||
- | |||
- | - Créez une archive zip (pas rare, aiguilles, 7zip ou autre fomrat) contenant: | ||
- | * tous les fichiers d'en-tête (* .h) | ||
- | * tous les fichiers sources (* .c) | ||
- | * Fichier Makefile (déjà fait dans le template de thème) | ||
- | * Fichier Lisez-moi | ||
- | - connectez-vous sur [[https: //vmchecker.cs.pub.ro | vmchecker]] | ||
- | - sélectionnez le cours // Systemes d'Explotation (FILS) // | ||
- | - sélectionnez // 3. Mini-Shell // | ||
- | - télécharger l'archive | ||
- | |||
- | |||
- | <note> | ||
- | L'archive doit contenir tous les fichiers (principaux) à la racine, pas dans les sous-répertoires. NE PAS archiver le répertoire du thème, archiver les fichiers DIRECT. | ||
- | |||
- | N'incluez PAS les fichiers objets (* .o) et l'exécutable. (Astuce: utilisez // make clean // pour les supprimer avant d’archiver le thème) | ||
- | </note> | ||
- | |||
- | Après avoir chargé l'archive, vmchecker s'exécutera: | ||
- | <code bash> | ||
- | unzip archive.zip homework | ||
- | cd homework | ||
- | make build | ||
- | make run | ||
- | </code> | ||