Differences

This shows you the differences between two versions of the page.

Link to this comparison view

sde:teme:tema_fr_3 [2019/03/20 18:49]
alexandru.radovici [Remarques générales]
— (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 | tema3]] sur le [[https://​github.com/​upb-fils/​sde|repository de 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>​ 
- 
- 
-==== Archivage de devoir ==== 
-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 // 2. 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 devoir, 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>​ 
  
sde/teme/tema_fr_3.1553100552.txt.gz · Last modified: 2019/03/20 18:49 by alexandru.radovici
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0