Systèmes dexploitation et programmation de systèmes -GPA435- Cours #5: Éléments de programmation (Partie 2) Enseignant: Jean-Philippe Roberge Jean-Philippe Roberge - Mai 2014
Planification du cours #5 Petite révision du cours #4: Substitution de variables et de commandes (mention seulement) Paramètres du shell ( Une dernière fois) Lecture et affichage Décision et bouclage Théorie du cours #5: Fonctions utilisateur du shell Neutralisation des caractères Commandes exec et trap Déverminage Renseignements par rapport à lexamen intra 2 Jean-Philippe Roberge - Mai 2014
Paramètres de position Paramètres de position commande param1 param2 param2 param4 3 Il sagit du nom de la commande. Le nom de la commande est représenté par le paramètre de position $0. Ce sont des paramètres de la commande. Dans linterpréteur de commande, le contenu de ces paramètres est représenté par: $1, $2, $3 jusquà $9 Retour sur le cours #4 (1) 3
Paramètres de position Paramètres de position Nous pouvons manipuler les paramètres de position: Nous pouvons manipuler les paramètres de position: o Le décalage vers la gauche à laide de shift 4 #!/bin/bash # Nom du programme: decalage # decalage: démontrer l'utilisation de shift pour décalage les paramètres # de position vers la gauche echo "La ligne de commande est: echo "Paramètre de position 1: $1" shift echo "Paramètre de position 1: $1" shift echo "Paramètre de position 1: $1" shift echo "Paramètre de position 1: $1" Décaler à gauche dune position Retour sur le cours #4 (2) 4
Paramètres de position Paramètres de position Symboles associés Symboles associés 5 SymboleSignification $0 Nom de la commande $1 à $9 Contenu des paramètres de position de la commande $$ Numéro de processus (PID) de linterpréteur de commande qui exécute la commande $# Nombre de paramètres de position Contenu de la ligne de commande Retour sur le cours #4 (3) 5
Ces variables sont prédéfinies par linterpréteur de commande et sont disponibles pour les programmes utilisateurs Ces variables sont prédéfinies par linterpréteur de commande et sont disponibles pour les programmes utilisateurs 6 VariablesSignification $? Létat de terminaison de la dernière commande exécutée $HOME Le chemin de répertoire menant vers le dossier de lutilisateur $PATH Le chemin de fouille pour les programmes et commandes $USER Le nom dutilisateur $HOSTNAME Le nom de lordinateur $OSTYPE Le nom du système dexploitation $UID Le numéro de lutilisateur $* Contenu de la ligne de commande Retour sur le cours #4 (4) 6
La commande read(1) réalise la lecture des données à partir de lentrée standard: La commande read(1) réalise la lecture des données à partir de lentrée standard: read var1 var2 var3 o Lecture de lentrée standard et place les données dans les variables var1, var2 et var3. o La séparation des données en champs est réalisée par linterpréteur de commande à laide de la variable IFS (Internal Field Separator). o IFS contient habituellement les caractères espace, tab et ENTER. 7 voici une-ligne de données ! Il y a 5 champs var1var2var3 Retour sur le cours #4 (5) 7
La commande read(1) La commande read(1) 8 La commande read placera les données lues dans les variables: POSITION_1, POSITION_2, POSITION_3 et LE_RESTE_DES_EQUIPES ensuite la commande echo affichera le contenu des variables à la sortie standard. Retour sur le cours #4 (6) 8
La commande echo(1) réalise laffichage à la sortie standard: La commande echo(1) réalise laffichage à la sortie standard: echo Allo tout le monde echo $var1 $var2 $var3 o Affiche à la sortie standard le contenu des variables var1, var2 et var3. echo -e $var1 $var2 $var3 o Loption –e permet lintroduction des codes de contrôle daffichage 9 \n nouvelle ligne \t tab \r return \b backspace \c continuer laffichage sur la même ligne Consulter man echo pour connaître tous les codes de contrôle acceptés par la commande echo. Retour sur le cours #4 (7) 9
La commande printf(1) réalise laffichage à la sortie standard: La commande printf(1) réalise laffichage à la sortie standard: printf "Allo tout le monde\n" printf "%s\t%s\t%s\n" $var1 $var2 $var3 o Affiche à la sortie standard le contenu de var1, suivi du code tabulation, suivi du contenu de var2, suivi du code tabulation, suivi du contenu de var3 suivi du code nouvelle ligne. o La chaîne "%s\t%s\t%s\n" est appelée chaîne de formatage et elle accepte les mêmes formats que sa contrepartie du langage C. En voici quelques exemples: 10 %s chaîne de caractères %d, %i nombre décimal signé %u nombre décimal non signé %f nombre en virgule flottant %c un caractère Consulter man printf pour connaître tous les formatages acceptés par la commande printf. Retour sur le cours #4 (8) 10
Instruction if – then - else - fi Instruction if – then - else - fi 11 #!/bin/bash # Nom du programme: affiche # affiche: démontrer l'utilisation des instructions if - then - else - fi if [ $# = 0 ] # si la commande a été lancée sans aucun paramètre de position... then echo "Usage: affiche [-v] nom_fichier" 1>&2 echo " -v utilise more pour formater l'affichage" 1>&2 exit 1 # erreur alors donner le code de retour 1 fi if [ "$1" != "-v" ]; then cat "$1" # pas d'option "-v" alors c'est le nom du fichier à afficher else if [ "$2" != "" ]; then cat "$2" | more # alors afficher le fichier avec formatage par more else echo "Nom du fichier à affiche est manquant" exit 1 # erreur alors donner le code de retour 1 fi exit 0 # tout va bien alors donner le code de retour 0 Retour sur le cours #4 (9) 11
Nous pouvons tester un ensemble de conditions par des opérateurs logiques et des options de linstruction if Nous pouvons tester un ensemble de conditions par des opérateurs logiques et des options de linstruction if 12 #!/bin/bash # Nom du programme: iftest # iftest: démontrer l'utilisation des opérateurs logiques avec l'instruction if # voir si le fichier suivant existe et... NOMFICHIER="$HOME"/GPA435/chap6/affiche if [ -f "$NOMFICHIER" ] then # voir s'il possède les permissions en lecture ou en écriture mais pas d'exécution if [ \( -r "$NOMFICHIER" -o -w "$NOMFICHIER" \) -a ! -x "$NOMFICHIER" ]; then echo "$NOMFICHIER accessible en lecture ou en écriture seulement" else echo "$NOMFICHIER est exécutable" fi else echo "$NOMFICHIER n'existe pas" fi Consulter man test ou les notes de cours chapitre 6 pour connaître les opérateurs logiques et options disponibles Retour sur le cours #4 (10) 12
Instruction for – done Instruction for – done Bouclage sur les paramètres de position Bouclage sur les paramètres de position 13 #!/bin/bash # Nom du programme: fortest1 # fortest1: montrer bouclage for - done sur les paramètres de position # voir si les fichiers donnés à la ligne de commande existent... if [ $# -ne 0 ]; then # boucler sur les paramètres de position for NOMFICH do if [ -f "$NOMFICH" ] ; then printf "%s existe\n" "$NOMFICH" else printf "%s n'existe pas\n" "$NOMFICH" fi done exit 0 else echo "Pas de paramètres de position ;((" fi exit 1 Variable qui recevra tour à tour les paramètres de position données à la ligne de commande Retour sur le cours #4 (11) 13
Instruction for – done Instruction for – done Bouclage sur une liste de paramètres donnés dans le programme Bouclage sur une liste de paramètres donnés dans le programme 14 #!/bin/bash # Nom du programme: fortest2 # fortest1: montrer bouclage for - done sur les paramètres donnés dans le programme # voir si les fichiers donnés à la ligne de commande existent... for NOMFICH in "affiche" "iftest" "lecture" "toto" do if [ -f "$NOMFICH" ] ; then printf "%s existe\n" "$NOMFICH" else printf "%s n'existe pas\n" "$NOMFICH" fi done Retour sur le cours #4 (12) 14
Instruction case - esac Instruction case - esac Voici la liste des descripteurs de case - esac Voici la liste des descripteurs de case - esac 15 Descripteu r Signification * Une chaîne de caractères quelconque incluant la chaîne vide ? Un caractère quelconque incluant le caractère vide [abcdeFg] Un caractère parmi ceux placés entre crochets (OU- logique implicite) [a-z] Un caractère parmi la gamme de caractères placés entre crochets (OU-logique implicite) [!abcdeFg][!a-z] Un caractère qui nest pas ceux placé entre crochets (négation-logique) xabcdeFg Un ou plusieurs caractères donnés explicitement (ET- logique implicite) Retour sur le cours #4 (13) 15
Instruction case - esac Instruction case - esac 16 #!/bin/bash # Nom du programme: casesac # casesac: montrer l'utilisation de case - esac # traiter les paramètres de position d'une commande if [ $# -eq 0 ]; then echo "usage: casesac -t -q -l nom_du_fichier" exit 1 fi # utiliser case - esac pour traiter les paramètres de position for OPTION ; do case "$OPTION" in -t) echo "Option -t reçue" OPT_T="OUI" ;; -q) echo "Option -q reçue" ; OPT_Q="OUI" ;; -l) echo "Option -l reçue" ; OPT_L="OUI" ;; [!-]*) echo "Nom du fichier reçu"; NOM_FICH="$OPTION" ;; *) echo "Option inconnue $OPTION reçue" ;; esac done if [ -f "$NOM_FICH" ]; then echo "Fichier $NOM_FICH existe!" else echo "Fichier $NOM_FICH n'existe pas!" fi Que signifie le descripteur ? [!-]* Pourquoi le descripteur *) est-il placé à la fin de case – esac dans cet exemple? Retour sur le cours #4 (14) 16
Instruction while – do - done Instruction while – do - done 17 #!/bin/bash # Nom du programme: whiletest # whiletest: montrer l'utilisation de while - do - done # boucler et demander à l'utilisateur le nom d'un répertoire # qui doit exister REPERTOIRE= while [ ! -d "$REPERTOIRE" ] do printf "Donner le nom d'un répertoire existant: " read REPERTOIRE done echo "Merci!" Retour sur le cours #4 (15) 17
Instruction until – do - done Instruction until – do - done 18 #!/bin/bash # Nom du programme: untiltest # untiltest: montrer l'utilisation de until - do - done # boucler et demander à l'utilisateur le nom d'un répertoire # qui doit exister REPERTOIRE= until [ -d "$REPERTOIRE" ] do printf "Donner le nom d'un répertoire existant: " read REPERTOIRE done echo "Merci!" On voit très bien que until – do – done est le complément de while – do - done Retour sur le cours #4 (16) 18
Quelques exemples récapitulatifs…
Cours #5
Nous pouvons rendre la programmation plus structurée en utilisant des fonctions Nous pouvons rendre la programmation plus structurée en utilisant des fonctions La syntaxe est: La syntaxe est: Nom_fonction () { commandes commandes} Une fonction utilisateur joue le rôle dune sous-routine. Une fonction utilisateur joue le rôle dune sous-routine. 21 Fonctions utilisateur (1)
Caractéristiques des fonctions utilisateurs: Caractéristiques des fonctions utilisateurs: o Syntaxe nom_fonction () { commandes } o Définition des fonctions utilisateurs au début du fichier de commandes o Prend préséance sur les commandes systèmes portant le même nom – Attention! Source de confusion! o Doit avoir un statut (valeur) de retour : exit n où n est un entier positif ( 0 OK,0 Erreur). Par défaut une fonction utilisateur retourne la valeur 0 comme statut de retour. 22 Fonctions utilisateur (2)
Passage des paramètres dans une fonction utilisateur Passage des paramètres dans une fonction utilisateur o Par variables globales ERRNO=1234 gestion_erreur () { case "$ERRNO" in case "$ERRNO" in 0) ;; # pas d'erreur 0) ;; # pas d'erreur 101) echo "Répertoire inexistant" ;; 101) echo "Répertoire inexistant" ;; 102) echo "Permission d'écriture obligatoire";; 102) echo "Permission d'écriture obligatoire";; *) echo "Code d'erreur inconnu" *) echo "Code d'erreur inconnu" exit 1 exit 1 ;; ;; esac esac} while [ $ERRNO -ne 0 ] do repertoire; ERRNO=$? repertoire; ERRNO=$? gestion_erreur gestion_erreurdone 23 1) Le contenu de la variable globale ERRNO est visible par la fonction gestion_erreur() puisquelle a été déclarée avant la définition de la fonction. 2) La fonction gestion_erreur() peut traiter le contenu de la variable globale ERRNO. Fonctions utilisateur (3)
Passage des paramètres dans une fonction utilisateur Passage des paramètres dans une fonction utilisateur o Par paramètres de position gestion_erreur () { case "$1" in case "$1" in 0) ;; # pas d'erreur 0) ;; # pas d'erreur 101) echo "Répertoire inexistant" ;; 101) echo "Répertoire inexistant" ;; 102) echo "Permission d'écriture obligatoire";; 102) echo "Permission d'écriture obligatoire";; *) echo "Code d'erreur inconnu" *) echo "Code d'erreur inconnu" exit 1 exit 1 ;; ;; esac esac}ERRNO=123 while [ $ERRNO -ne 0 ] do repertoire; ERRNO=$? repertoire; ERRNO=$? gestion_erreur "$ERRNO" gestion_erreur "$ERRNO"done 24 1) Le contenu de la variable ERRNO est passé à la fonction gestion_erreur() comme un paramètre de position. 2) La fonction gestion_erreur() reçoit le contenu de la variable ERRNO dans sa variable de position $1. Fonctions utilisateur (4)
Passage des paramètres dans une fonction utilisateur Passage des paramètres dans une fonction utilisateur o Par paramètres de position o De façon générale: # définition de la fonction funcA () { # $# le nombre de paramètres de position # $* et la ligne des paramètres de position # $1 reçoit le contenu de $par1 # $2 reçoit le contenu de $par2 # $3 reçoit le contenu de $par3 # et ainsi de suite } # utilisation de la fonction funcA par1 par2 par3 25 Donc, pour une fonction utilisateur, les paramètres de position se comportent exactement comme un programme Fonctions utilisateur (5)
Certains caractères ont une signification spéciale pour linterpréteur de commande Certains caractères ont une signification spéciale pour linterpréteur de commande Par exemple: Par exemple: o &, (, ), *, !, $, etc. Cependant, à cause du nombre limité de caractères disponibles, certaines commandes et programmes réutilisent ces mêmes caractères mais à dautres fins Cependant, à cause du nombre limité de caractères disponibles, certaines commandes et programmes réutilisent ces mêmes caractères mais à dautres fins Par exemple: Par exemple: o $ pour signifie la valeur monétaire; o () pour regrouper les expressions mathématiques, logiques, etc…; o etc… 26 Neutralisation des caractères (1)
Sans un mécanisme de contournement, ces caractères spéciaux seront interprétés dune façon erronée par linterpréteur de commande. Sans un mécanisme de contournement, ces caractères spéciaux seront interprétés dune façon erronée par linterpréteur de commande. Les commandes et programmes qui utilisent ces caractères spéciaux ne pourront pas sexécuter correctement. Les commandes et programmes qui utilisent ces caractères spéciaux ne pourront pas sexécuter correctement. Doù la nécessité de neutraliser la signification particulière de ces caractères spéciaux pour linterpréteur de commande. Doù la nécessité de neutraliser la signification particulière de ces caractères spéciaux pour linterpréteur de commande. 27 Neutralisation des caractères (2)
Un exemple Un exemple Nous désirons afficher la chaîne de caractère « Lola & Lilo ». Voici le résultat: Nous désirons afficher la chaîne de caractère « Lola & Lilo ». Voici le résultat: 28 Linterpréteur de commande a interprété ceci: 1.Exécuter echo Lola & ( echo Lola en arrière-plan); 2.Exécuter Lilo comme une commande. Neutralisation des caractères (3)
Un exemple Un exemple Nous désirons afficher la chaîne de caractère « Lola & Lilo ». Voici le résultat: Nous désirons afficher la chaîne de caractère « Lola & Lilo ». Voici le résultat: 29 Le méta-caractère & est neutralisé par le symbole \ qui agit comme un neutralisateur. Linterpréteur de commande considérera \& comme le caractère & et non pas le symbole pour lexécution en arrière-plan. Neutralisation des caractères (4)
Ainsi, le symbole \ permet la neutralisation du caractère qui le suit. Ainsi, le symbole \ permet la neutralisation du caractère qui le suit. 30 Le symbole \ a effectivement neutralisé le premier méta- caractère & mais pas le 2 e. On dit que \ est un neutralisateur de simple (1 seul) caractère. Neutralisation des caractères (5)
Nous pouvons neutraliser plus dun caractère à la fois par les guillemets et les apostrophes. Nous pouvons neutraliser plus dun caractère à la fois par les guillemets et les apostrophes. Guillemets Guillemets o Neutralise la signification spéciale du caractère ESPACE; o Permet la substitution des variables et des commandes; o Permet lutilisation du neutralisateur \. 31 Bug 1: $CAD est interprété comme le contenu de la variable CAD et non pas dollar canadien Bug 2: Le caractère ESPACE a séparé la chaîne de caractères en 2 parties Lutilisation des guillemets et de \ permet de solutionner ce problème. Neutralisation des caractères (6)
Nous pouvons neutraliser plus dun caractère à la fois par les guillemets et les apostrophes. Nous pouvons neutraliser plus dun caractère à la fois par les guillemets et les apostrophes. Apostrophes Apostrophes o Neutralise la signification spéciale du caractère ESPACE; o Empêche la substitution des variables et des commandes; o Neutralise le neutralisateur \. 32 Les apostrophes ont effectivement neutralisé le neutralisateur \ et empêché la substitution de la variable CAD. Neutralisation des caractères (7)
Dautres exemples qui aident à la compréhension de la neutralisation des méta- caractères Dautres exemples qui aident à la compréhension de la neutralisation des méta- caractères 33 gpa435> MACHINE=`hostname` gpa435 > echo La machine \'$MACHINE\' est en panne La machine 'my-ubuntu' est en panne gpa435 > echo La machine "'$MACHINE'" est en panne La machine 'my-ubuntu' est en panne gpa435 > echo La machine '$MACHINE' est en panne La machine $MACHINE est en panne gpa435 > echo "La machine '$MACHINE' est en panne" La machine 'my-ubuntu' est en panne gpa435 > echo 'La machine $MACHINE est en panne' La machine $MACHINE est en panne gpa435 > echo 'La machine '$MACHINE' est en panne' La machine my-ubuntu est en panne Neutralisation des caractères (8)
Dans un programme, la commande exec(1) permet lexécution dune commande sans la création dun nouveau processus. Dans un programme, la commande exec(1) permet lexécution dune commande sans la création dun nouveau processus. Vous pouvez donc passer des paramètres du programme à la commande à exécuter. Vous pouvez donc passer des paramètres du programme à la commande à exécuter. Attention! Ce nest pas un appel de sous-routine car le contrôle ne revient pas au programme. Attention! Ce nest pas un appel de sous-routine car le contrôle ne revient pas au programme. 34 Commandes exec(1) et trap(1)
Voici un exemple: Voici un exemple: 35 La ligne exec date exécute la commande date et lui passe le contrôle. Résultat: On voit que la ligne echo "Fin du programme" nest jamais exécutée. Commandes exec(1) et trap(1)
La commande exec(1) sert aussi à rediriger les entrées-sorties standard dune façon globale. La commande exec(1) sert aussi à rediriger les entrées-sorties standard dune façon globale. Différentes syntaxes: Différentes syntaxes: exec no_desc> nom_fich exec no_desc> nom_fich exec no_desc>&no_desc exec no_desc>&no_desc exec no_desc>> nom_fich exec no_desc>> nom_fich exec no_desc< nom_fich exec no_desc< nom_fich exec no_desc<&no_desc exec no_desc<&no_desc 36 Légende: no_desc : numéro descripteur nom_fich : nom de fichier >, >&, >>,, >&, >>, <, <& : opérateurs de redirection Commandes exec(1) et trap(1)
Un exemple: Un exemple: 37 À partir de ce point, tous les messages derreur seront envoyés dans un fichier nommé errmsg.txt. On pourra en faire de même pour rediriger dune façon globale la sortie standard et lentrée standard en utilisant les opérateurs de redirection appropriés. Commandes exec(1) et trap(1)
La commande trap(1) est fort utile pour la programmation La commande trap(1) est fort utile pour la programmation La syntaxe: La syntaxe: trap commandes signaux o commandes est un ensemble de commandes Linux; o signaux sont des numéros (entiers). À la réception dun signal par le programme, les commandes entre apostrophes sont exécutées. À la réception dun signal par le programme, les commandes entre apostrophes sont exécutées. 38 Commandes exec(1) et trap(1)
Quelle est lutilité de trap(1) ? Quelle est lutilité de trap(1) ? Pour réaliser une fin de programme en « beauté » Pour réaliser une fin de programme en « beauté » o Advenant une erreur fatale, le programme pourra effacer ses fichiers temporaires, arrêter ses processus fils, fermer ses ports internet, afficher un message durgence, etc. Pour empêcher certains évènements inappropriés de faire avorter le programme Pour empêcher certains évènements inappropriés de faire avorter le programme o Le disque plein, la clé USB nest plus disponible, le programme change son état par les touches ctrl-c, ctrl-y, ctrl-z, etc. 39 Commandes exec(1) et trap(1)
Voici quelques signaux disponibles Voici quelques signaux disponibles 40 SignalSignification ctrl-c Interrompre le programme ctrl-y Suspendre (bloque) le programme lorsquil tentera de lire lentrée standard ctrl-z Suspendre (bloque) le programme 1 Couper le lien logique avec le terminal 2 Interrompre le programme 9 Tuer (kill) le programme 15 Fin (normale) du programme 17, 19, 23 Arrêter le programme Les signaux 9, 17, 19 et 23 ne peuvent être interceptés par trap(1), Saviez-vous pourquoi? Commandes exec(1) et trap(1)
Exemple dutilisation de trap(1) Exemple dutilisation de trap(1) 41 Ce programme ne fait rien pendant 100 secondes (sleep 100). Envoyez le signal ctrl-c au programme. La commande trap(1) interceptera le signal et affiche un message à la sortie standard. Commandes exec(1) et trap(1)
Exemple dutilisation de trap(1) Exemple dutilisation de trap(1) 42 Ce programme ne fait rien pendant 100 secondes (sleep 100). Envoyez le signal ctrl-z pour suspendre le programme. Entrer la commande bg pour exécuter le programme en arrière-plan. Entrer la commande fg pour exécuter le programme en avant-plan À la fin du programme, trap(1) affiche un message. Commandes exec(1) et trap(1)
Fin de la deuxième partie du chapitre 6
Examen intra Je serai absent pour les deux prochaines semaines, Patricia Ouimet me remplacera. Date: Lundi le 9 juin 2014 Durée: 3 heures Documentation: Toute documentation permise Lieu: Local de cours habituel (B-1510) Contenu: Matière du cours 1 à 6 inclusivement Chapitres 1, 4, 5, 6 et 7 Questions par courriels à lavance dans la mesure du possible 44 Jean-Philippe Roberge - Avril 2014
Références [1] Présentations PowerPoint du cours GPA435, Tony Wong. [2] Notes de cours, GPA435 [3] Levasseur, Yan, Wiki GPA435: consulté en avril [4] Tanenbaum, A.S., Systèmes dexploitation. Pearson Education France, [5] Stallings, W., Operating Systems : Internals and Design Principals. Upper Saddle River, NJ : Prentice Hall, [6] Références citées dans le premier chapitre des notes de cours. 45 Jean-Philippe Roberge - Avril 2014