GPA435, GPA – ÉTS, T. Wong
Génie de la production automatisée
GPA435 Système d’exploitation et programmation de systèmeChapitre 6Partie II2014
GPA435, GPA – ÉTS, T. Wong
Fonctions utilisateurs
Nous pouvons rendre la programmation plus structurée en utilisant des fonctions
La syntaxe est:
Nom_fonction () { commandes}
Une fonction utilisateur joue le rôle d’une sous-routine.
2
GPA435, GPA – ÉTS, T. Wong
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.
3
GPA435, GPA – ÉTS, T. Wong
Fonctions utilisateurs
Passage des paramètres dans une fonction utilisateur
o Par variables globales
ERRNO=1234gestion_erreur () { case "$ERRNO" in 0) ;; # pas d'erreur 101) echo "Répertoire inexistant" ;; 102) echo "Permission d'écriture obligatoire";; *) echo "Code d'erreur inconnu" exit 1 ;; esac}
while [ $ERRNO -ne 0 ]do repertoire; ERRNO=$? gestion_erreurdone
4
1) Le contenu de la variable globale ERRNO est visible par la fonction gestion_erreur() puisqu’elle 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.
GPA435, GPA – ÉTS, T. Wong
Fonctions utilisateurs
Passage des paramètres dans une fonction utilisateur
o Par paramètres de position
gestion_erreur () { case "$1" in 0) ;; # pas d'erreur 101) echo "Répertoire inexistant" ;; 102) echo "Permission d'écriture obligatoire";; *) echo "Code d'erreur inconnu" exit 1 ;; esac}
ERRNO=123while [ $ERRNO -ne 0 ]do repertoire; ERRNO=$? gestion_erreur "$ERRNO"done 5
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.
GPA435, GPA – ÉTS, T. Wong
Fonctions utilisateurs
Passage des paramètres dans une fonction utilisateur
o Par paramètres de positiono De façon générale:
# définition de la fonctionfuncA () {
# $# 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 fonctionfuncA par1 par2 par3
6
Donc, pour une fonction utilisateur, les paramètres de position se comportent exactement comme un programme
GPA435, GPA – ÉTS, T. Wong
Neutralisation des caractères
Certains caractères ont une signification spéciale pour l’interpréteur de commande• 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 à d’autres fin• Par exemple:
o $ pour signifie la valeur monétaire;o () pour regrouper les expressions mathématiques;o etc.
7
GPA435, GPA – ÉTS, T. Wong
Neutralisation des caractères
Sans un mécanisme de contournement, ces caractères spéciaux seront interprétés d’une façon erronée par l’interpréteur de commande.
Les commandes et programmes qui utilisent ces caractères spéciaux ne pourront pas s’exécuter correctement.
D’où la nécessité de neutraliser la signification particulière de ces caractères spéciaux pour l’interpréteur de commande.
8
GPA435, GPA – ÉTS, T. Wong
Neutralisation des caractères
Un exemple• Nous désirons afficher la chaîne de caractère
« Lola & Lilo ». Voici le résultat:
9
L’interpré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.
GPA435, GPA – ÉTS, T. Wong
Neutralisation des caractères
Un exemple• Nous désirons afficher la chaîne de caractère
« Lola & Lilo ». Voici le résultat:
10
Le méta-caractère & est neutralisé par le symbole \ qui agit comme un neutralisateur.
L’interpréteur de commande considérera \& comme le caractère & et non pas le symbole pour l’exécution en arrière-plan.
GPA435, GPA – ÉTS, T. Wong
Neutralisation des caractères
Ainsi, le symbole \ permet la neutralisation du caractère qui le suit.
11
Le symbole \ a effectivement neutralisé le premier méta-caractère & mais pas le 2e.
On dit que \ est un neutralisateur de simple (1 seul) caractère.
GPA435, GPA – ÉTS, T. Wong
Neutralisation des caractères
Nous pouvons neutraliser plus d’un caractère à la fois par les guillemets et les apostrophes.• Guillemets
o Neutralise la signification spéciale du caractère ESPACE;
o Permet la substitution des variables et des commandes;
o Permet l’utilisation du neutralisateur \.
12
Bug 1: $CAD est interprété comme
le contenu de la variable CAD et non pas dollar
canadienBug 2: Le
caractère ESPACE a séparé
la chaîne de caractères en 2
partiesL’utilisation des guillemets et de \ permet de solutionner ce problème.
GPA435, GPA – ÉTS, T. Wong
Neutralisation des caractères
Nous pouvons neutraliser plus d’un caractère à la fois par les guillemets et les 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 \.
13
Les apostrophes ont effectivement neutralisé le neutralisateur \ et empêché la substitution de la variable CAD.
GPA435, GPA – ÉTS, T. Wong
Neutralisation des caractères
D’autres exemples qui aident à la compréhension de la neutralisation des méta-caractères
14
gpa435> MACHINE=`hostname`gpa435 > echo La machine \'$MACHINE\' est en panneLa machine 'my-ubuntu' est en pannegpa435 > echo La machine "'$MACHINE'" est en panneLa machine 'my-ubuntu' est en pannegpa435 > echo La machine '$MACHINE' est en panneLa machine $MACHINE est en pannegpa435 > echo "La machine '$MACHINE' est en panne"La machine 'my-ubuntu' est en pannegpa435 > echo 'La machine $MACHINE est en panne'La machine $MACHINE est en pannegpa435 > echo 'La machine '$MACHINE' est en panne'La machine my-ubuntu est en panne
GPA435, GPA – ÉTS, T. Wong
Commandes exec(1) et trap(1)
Dans un programme, la commande exec(1) permet l’exécution d’une commande sans la création d’un nouveau processus.
Vous pouvez donc passer des paramètres du programme à la commande à exécuter.
Attention! Ce n’est pas un appel de sous-routine car le contrôle ne revient pas au programme.
15
GPA435, GPA – ÉTS, T. Wong
Commandes exec(1) et trap(1)
Voici un exemple:
16
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" n’est jamais exécutée.
GPA435, GPA – ÉTS, T. Wong
Commandes exec(1) et trap(1)
La commande exec(1) sert aussi à rediriger les entrées-sorties standard d’une façon globale.
Différentes syntaxes:• exec no_desc> nom_fich• exec no_desc>&no_desc• exec no_desc>> nom_fich• exec no_desc< nom_fich• exec no_desc<&no_desc
17
Légende:no_desc : numéro descripteurnom_fich : nom de fichier>, >&, >>, <, <& : opérateurs de redirection
GPA435, GPA – ÉTS, T. Wong
Commandes exec(1) et trap(1)
Un exemple:
18
À partir de ce point, tous les messages d’erreur seront envoyés dans un fichier nommé errmsg.txt.On pourra en faire de même pour rediriger d’une façon globale la sortie standard et l’entrée standard en utilisant les opérateurs de redirection appropriés.
GPA435, GPA – ÉTS, T. Wong
Commandes exec(1) et trap(1)
La commande trap(1) est fort utile pour la programmation
La syntaxe:trap ‘commandes’ signaux
o commandes est un ensemble de commandes Linux;o signaux sont des numéros (entiers).
À la réception d’un signal par le programme, les commandes entre apostrophes sont exécutées.
19
GPA435, GPA – ÉTS, T. Wong
Commandes exec(1) et trap(1)
Quelle est l’utilité de trap(1) ?• 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 d’urgence, etc.
• Pour empêcher certains évènements inappropriés de faire avorter le programmeo Le disque plein, la clé USB n’est plus disponible, le
programme change son état par les touches ctrl-c, ctrl-y, ctrl-z, etc.
20
GPA435, GPA – ÉTS, T. Wong
Commandes exec(1) et trap(1)
Voici quelques signaux disponibles
21
Signal Signification
ctrl-c Interrompre le programme
ctrl-y Suspendre (bloque) le programme lorsqu’il tentera de lire l’entré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?
GPA435, GPA – ÉTS, T. Wong
Commandes exec(1) et trap(1)
Exemple d’utilisation de trap(1)
22
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.
GPA435, GPA – ÉTS, T. Wong
Commandes exec(1) et trap(1)
Exemple d’utilisation de trap(1)
23
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.
GPA435, GPA – ÉTS, T. Wong
Fin de la deuxième partiedu chapitre 6