This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
1
GPA435 Systèmes GPA435 Systèmes d’exploitation et d’exploitation et programmation de programmation de systèmesystème
École de technologie supérieureDépartem ent de génie de la production autom atisée
2
Exemples de Exemples de programmation (1)programmation (1)Extraction des en-têtes de courrielExtraction des en-têtes de courriel
Les courriels sont enregistrés dans le fichier Les courriels sont enregistrés dans le fichier /var/mail/$USER/var/mail/$USER..
Les courriels est séparé par une ligne blanche.Les courriels est séparé par une ligne blanche.
Nous allons créer un petit programme Bourne Nous allons créer un petit programme Bourne shell afin de montrer les subtilités de sa shell afin de montrer les subtilités de sa programmation.programmation.
Système d’exploitation UNIX
3
Exemples de programmation Exemples de programmation (2)(2)
Système d’exploitation UNIX
OrdinogrammeOrdinogramme
Nous utiliserons Nous utiliserons grep(1)grep(1) et et expr(1)expr(1) pour extraire le pour extraire le champ Content-champ Content-Length:Length:
L’en-tête et le corps L’en-tête et le corps d’un courriel sont d’un courriel sont séparés par une ligne séparés par une ligne blanche. Chaque en-blanche. Chaque en-tête est enregistré dans tête est enregistré dans un fichier temporaireun fichier temporaireNous ferons un Nous ferons un bouclage pour passer bouclage pour passer « par dessus » le corps « par dessus » le corps du courrieldu courriel
D ébut
F in
Extraire l'en-tête
Extraire le cham pContent-Length:
Lire le nom bre decaractères indiqués par
Content-Length:
F in du fichier ?
Oui
Non
4
Exemples de programmation Exemples de programmation (3)(3)
Système d’exploitation UNIX
Chaque en-tête est enregistré dans un Chaque en-tête est enregistré dans un fichier temporaire. Pour la longueur fichier temporaire. Pour la longueur du corps du courriel:du corps du courriel:LONGUEUR=`egrep 'Content-Length:' entetes${COMPTEUR}.tmp`LONGUEUR=`egrep 'Content-Length:' entetes${COMPTEUR}.tmp`
Variable qui contiendra Variable qui contiendra la longueur du corpsla longueur du corps
Trouver la ligne désirée Trouver la ligne désirée dans le corpsdans le corps
Extraire la valeur Extraire la valeur située après le mot située après le mot
clé clé Content-Content-Length:Length:
5
Exemples de Exemples de programmation (4)programmation (4)Pour passer au prochain en-tête. Il Pour passer au prochain en-tête. Il
faut lire le nombre de caractères faut lire le nombre de caractères donnés par la valeur de Content-donnés par la valeur de Content-Length:Length:read DUMMYread DUMMY
Lire une ligne du fichier Lire une ligne du fichier d’entrée et faire la somme d’entrée et faire la somme des caractères lus.des caractères lus.
N’oublier pas de compter le N’oublier pas de compter le caractère Entercaractère Enter
6
Exemples de Exemples de programmation (5)programmation (5)Attention! Par défaut la commande Attention! Par défaut la commande read(1)read(1) utilise utilise
les caractères Espace, Tab et Enter comme les caractères Espace, Tab et Enter comme séparateur de champs.séparateur de champs.
La commande La commande read(1)read(1) ne conserve qu’une seule ne conserve qu’une seule copie des séparateurs dans une ligne lue. Ainsi,copie des séparateurs dans une ligne lue. Ainsi,
cette ligne contient des espacescette ligne contient des espaces
cette ligne contient des espacescette ligne contient des espaces
Système d’exploitation UNIX
Ligne originale dans le Ligne originale dans le fichier d’entréefichier d’entrée
Ligne lue par Ligne lue par read(1)read(1). . Donc, il y pertes de Donc, il y pertes de
caractères !!!!caractères !!!!
7
Exemples de Exemples de programmation (6)programmation (6)
Système d’exploitation UNIX
Solution pour ce problème ?Solution pour ce problème ?Régler la variable globale Bourne shell IFS (Régler la variable globale Bourne shell IFS (Internal Field Internal Field
SeparatorSeparator).).
Normalement la variable IFS est réglée à Espace, Tab et Normalement la variable IFS est réglée à Espace, Tab et Enter.Enter.
Il nous faut régler IFS à Enter seulement. Voici comment:Il nous faut régler IFS à Enter seulement. Voici comment:
IFS="IFS="
""
Oui. Il faut taper la touche Enter avant Oui. Il faut taper la touche Enter avant de fermer les guillemetsde fermer les guillemets
8
Système d’exploitation UNIX#!/bin/sh#!/bin/sh
# ex_entete# ex_entete
# Programme pour extraire l'en-tete des courriels.# Programme pour extraire l'en-tete des courriels.
##
# Fonction Bourne shell pour montrer l'usage de ce programme# Fonction Bourne shell pour montrer l'usage de ce programme
[ -z "$1" ] && usage # pas de fichier donne a la ligne de commande[ -z "$1" ] && usage # pas de fichier donne a la ligne de commande
Détection des options Détection des options données sur la ligne de données sur la ligne de commande.commande.
10
Système d’exploitation UNIX### Quelques variables globales ...# Quelques variables globales ...##CONTINUE=VRAICONTINUE=VRAICOMPTEUR=1COMPTEUR=1
# C'est tres important! Il faut regler IFS (separateur de champs pour# C'est tres important! Il faut regler IFS (separateur de champs pour# la commande read(1)) avec le caractere Enter. Sinon, read(1) va# la commande read(1)) avec le caractere Enter. Sinon, read(1) va# ignorer les caracters Espace et Tab. Dans le corps d'un courriel,# ignorer les caracters Espace et Tab. Dans le corps d'un courriel,# Espace et Tab sont comptes !!!# Espace et Tab sont comptes !!!IFS="IFS="""
while [ "$CONTINUE" = VRAI ]while [ "$CONTINUE" = VRAI ]dodo read LIGNE || exit 0read LIGNE || exit 0 # detecter la ligne blanche qui delimite l'en-tete# detecter la ligne blanche qui delimite l'en-tete if [ -z "$LIGNE" ]if [ -z "$LIGNE" ] thenthen ## # Obtenir la longueur du courriel# Obtenir la longueur du courriel ## LONGUEUR=`egrep 'Content-Length:' entetes${COMPTEUR}.tmp`LONGUEUR=`egrep 'Content-Length:' entetes${COMPTEUR}.tmp` LONGUEUR=`expr "$LONGUEUR" : 'Content-Length: \(.*\)'`LONGUEUR=`expr "$LONGUEUR" : 'Content-Length: \(.*\)'`
N’oubliez pas de régler N’oubliez pas de régler correctement la variable Bourne correctement la variable Bourne shell IFSshell IFS
OK. L ’en-tête est terminé. Aller OK. L ’en-tête est terminé. Aller chercher la longueur du corps ...chercher la longueur du corps ...
11
Système d’exploitation UNIX TOTAL=0TOTAL=0 while [ "$TOTAL" -lt "$LONGUEUR" ]while [ "$TOTAL" -lt "$LONGUEUR" ] dodo read DUMMYread DUMMY if [ $? -ne 0 ]if [ $? -ne 0 ] thenthen echo "La boite aux lettres est brisee !"echo "La boite aux lettres est brisee !" echo "Programme termine prematurement."echo "Programme termine prematurement." exit 1exit 1 elseelse CAR_LU=`/usr/ucb/expr length "$DUMMY"`CAR_LU=`/usr/ucb/expr length "$DUMMY"` TOTAL=`expr "$TOTAL" + "$CAR_LU"`TOTAL=`expr "$TOTAL" + "$CAR_LU"` TOTAL=`expr "$TOTAL" + 1`TOTAL=`expr "$TOTAL" + 1` fifi donedone # Sauter par dessus la derniere ligne blanche# Sauter par dessus la derniere ligne blanche read DUMMYread DUMMY elseelse ## # Ecrire l'en-tete dans le fichier temporaire# Ecrire l'en-tete dans le fichier temporaire ## echo "$LIGNE" >> entetes${COMPTEUR}.tmpecho "$LIGNE" >> entetes${COMPTEUR}.tmp fifidone < "$1"done < "$1"
Lire le nombre de Lire le nombre de caractères indiqués caractères indiqués par la valeur de par la valeur de « Content-Length: ».« Content-Length: ».Le fichier d’entrée Le fichier d’entrée est lu ligne par est lu ligne par ligne.ligne.N’oubliez pas N’oubliez pas d’ajouter le d’ajouter le caractère Enter caractère Enter dans le comptage.dans le comptage.
C’est une ligne de C’est une ligne de l’en-têtel’en-tête
12
Exemples de programmation Exemples de programmation (7)(7)
Système d’exploitation UNIX
Pour terminer une tâche errante, nous devons Pour terminer une tâche errante, nous devons utiliser la commande utiliser la commande ps(1)ps(1) et et kill(1)kill(1)..
La commande La commande ps(1)ps(1) permet d’obtenir le PID permet d’obtenir le PID du processus à fautif.du processus à fautif.
La commande La commande kill(1)kill(1) permet l’élimination permet l’élimination du processus à l’aide de son PID.du processus à l’aide de son PID.
13
Exemples de programmation Exemples de programmation (8)(8)
C’est le champ $1 pour C’est le champ $1 pour nawk(1)nawk(1) lorsque lorsque la commande utilisée est la commande utilisée est ps -eps -e
14
Exemples de programmation Exemples de programmation (8)(8)
Système d’exploitation UNIX
Pour terminer une tâche dont le PID Pour terminer une tâche dont le PID est 4003:est 4003:
kill -9 4003kill -9 4003
Le signal à envoyer au Le signal à envoyer au processus (par processus (par exemple)exemple)
Le PID du processus Le PID du processus à « tuer »à « tuer »
15
Exemples de programmation Exemples de programmation (9)(9)
Système d’exploitation UNIX
Le problème: il faut connaître le PID du processus Le problème: il faut connaître le PID du processus errant !!!errant !!!
Nous allons écrire un programme Bourne shell capable Nous allons écrire un programme Bourne shell capable de « tuer » un ou plusieurs processus par leur nom au de « tuer » un ou plusieurs processus par leur nom au lieu de leur PID.lieu de leur PID.
Mieux encore, nous pouvons aussi utiliser une Mieux encore, nous pouvons aussi utiliser une expression générique pour spécifier les noms de expression générique pour spécifier les noms de processus.processus.
16
Système d’exploitation UNIX#!/bin/sh#!/bin/sh
# Par mesure de securite ...# Par mesure de securite ...
# si le numero du signal est donne ...# si le numero du signal est donne ...
-*) SIG=$1-*) SIG=$1
shiftshift
esacesac
La variable IFS réglée à Espace ...La variable IFS réglée à Espace ...
Traitement des Traitement des options du options du programmesprogrammes
17
Système d’exploitation UNIX### Trouver les PID des processus identifies par leur nom# Trouver les PID des processus identifies par leur nom##numjob=`ps -e | egrep "$1" | nawk '{print $1}'`numjob=`ps -e | egrep "$1" | nawk '{print $1}'`
### Continuer le traitement seulement si les processus# Continuer le traitement seulement si les processus# sont trouves# sont trouves##if [ "$numjob" ]if [ "$numjob" ]thenthen set $numjob # les PID seront separes par desset $numjob # les PID seront separes par des # nouvelles lignes# nouvelles lignes while [ $# -ne 0 ]while [ $# -ne 0 ] dodo if [ $1 -lt $$ ] # tuer seulement les processus lances if [ $1 -lt $$ ] # tuer seulement les processus lances then # avant l'execution de ce scriptthen # avant l'execution de ce script kill $SIG $1 kill $SIG $1 fifi shiftshift done done elseelse echo "Ne trouve le ou les processus" 1>&2echo "Ne trouve le ou les processus" 1>&2fifi
La recherche du PID des processus à éliminerLa recherche du PID des processus à éliminer
Mettre les PID trouvés comme des paramètres Mettre les PID trouvés comme des paramètres de positionde position
18
Exemples de programmation Exemples de programmation (10)(10)
Système d’exploitation UNIX
L’intégration UNIX - PC est un but L’intégration UNIX - PC est un but recherché depuis longtemps.recherché depuis longtemps.
Une réalité est l’arrimage des systèmes de Une réalité est l’arrimage des systèmes de fichiers UNIX et PC.fichiers UNIX et PC.
Le système NFS (Le système NFS (Network FileSystemNetwork FileSystem) est ) est le dénominateur commun entre le monde le dénominateur commun entre le monde UNIX et le monde PC.UNIX et le monde PC.
La famille des produits HummingBird La famille des produits HummingBird Maestro permet l’intégration des systèmes Maestro permet l’intégration des systèmes de fichiers NTFS et UFS via le NFS.de fichiers NTFS et UFS via le NFS.
19
Exemples de programmation Exemples de programmation (11)(11)
Système d’exploitation UNIX
Un répertoire UNIX (Un répertoire UNIX ($HOME$HOME) en provenance ) en provenance du serveur UNIX du serveur UNIX lca0.lca.etsmtl.calca0.lca.etsmtl.ca
20
Exemples de programmation Exemples de programmation (12)(12)
Système d’exploitation UNIX
Pour réaliser la connexion des systèmes de fichiers:Pour réaliser la connexion des systèmes de fichiers:Une machine UNIX joue le rôle du serveur NFSUne machine UNIX joue le rôle du serveur NFSUne ou plusieurs machines PC jouent le rôle de clients NFSUne ou plusieurs machines PC jouent le rôle de clients NFS
Pour le serveur NFS (UNIX):Pour le serveur NFS (UNIX):Il faut démarrer le programme d’authentification NFS nommé Il faut démarrer le programme d’authentification NFS nommé hclnfsdhclnfsd
De plus, les programmes De plus, les programmes statdstatd et et lockdlockd doivent être démarrés doivent être démarrés au préalable.au préalable.
21
Exemples de programmation Exemples de programmation (13)(13)
Système d’exploitation UNIX
Dans notre cas, le programme d’authenti-fication NFS Dans notre cas, le programme d’authenti-fication NFS hclnfsdhclnfsd est invoqué automatiquement à l ’aide d’un est invoqué automatiquement à l ’aide d’un programme Bourne shell.programme Bourne shell.
Nous allons créer un programme capable de détecter la Nous allons créer un programme capable de détecter la présence de présence de statdstatd et et lockdlockd avant le lancement de avant le lancement de hclnfsdhclnfsd..
De plus, on s’assure qu’il n’existe pas de De plus, on s’assure qu’il n’existe pas de hclnfsdhclnfsd déjà déjà en mémoire avant son lancement.en mémoire avant son lancement.
22
Exemples de programmation Exemples de programmation (14)(14)
Système d’exploitation UNIX
Normalement, les programmes Normalement, les programmes statdstatd et et lockdlockd sont toujours en mémoire. sont toujours en mémoire.
Ils sont lancés au démarrage de la machine Ils sont lancés au démarrage de la machine UNIXUNIX PID TTY TIME CMD
Résultats Résultats affichés par affichés par ps ps
-e-e
Note: La colonne Note: La colonne PID est le champ PID est le champ $1 pour $1 pour nawk(1)nawk(1)
statdstatd permet permet l’obtention des l’obtention des attributs de attributs de fichiers.fichiers.
lockdlockd permet le permet le verrouillage des verrouillage des fichiers.fichiers.
23
Système d’exploitation UNIX#!/bin/sh#!/bin/sh
# S991hclnfsd.server# S991hclnfsd.server
##
# Copyright (c) 1999 par # Copyright (c) 1999 par Tony WongTony Wong# Departement de genie de production automatisee# Departement de genie de production automatisee
# Ecole de technologie superieure# Ecole de technologie superieure
# Universite du Quebec # Universite du Quebec
##
##
# Demarrage du service d'authentification NFS pour PC# Demarrage du service d'authentification NFS pour PC
# (hclnfsd) de HummingBird Communications Ltd # (hclnfsd) de HummingBird Communications Ltd
D’accord… c’est de la D’accord… c’est de la publicité gratuite ...publicité gratuite ...
24
Système d’exploitation UNIX# arret() : Fonction qui termine l'execution d'un ou# arret() : Fonction qui termine l'execution d'un ou
# ou plusieurs processus hclnfsd# ou plusieurs processus hclnfsd
Fonction Bourne shell utilisant Fonction Bourne shell utilisant nawk(1)nawk(1) pour éliminer les instances de pour éliminer les instances de hclnfsdhclnfsd
déjà en mémoiredéjà en mémoire
Voici comment exécuter une Voici comment exécuter une commande ou programme UNIX à commande ou programme UNIX à
l ’intérieur de l ’intérieur de nawk(1)nawk(1)..
Noter le passage de paramètres Noter le passage de paramètres nawk(1)nawk(1) vers la commande UNIX. vers la commande UNIX.
Cette fonction retourne un statut de Cette fonction retourne un statut de sortie 0 si le nom du processus passé sortie 0 si le nom du processus passé en paramètre existe en mémoireen paramètre existe en mémoire
25
Système d’exploitation UNIXcase "$1" incase "$1" in
'start')'start') if trouve "statd" -a trouve "lockd" if trouve "statd" -a trouve "lockd" then then if trouve "hclnfsd"if trouve "hclnfsd" thenthen echo "hclnfsd deja en service !"echo "hclnfsd deja en service !" echo "Arreter le service d'abord"echo "Arreter le service d'abord" elseelse hclnfsd -A -Xhclnfsd -A -X fifi elseelse echo "Services de support inexistants"echo "Services de support inexistants" echo "(statd et/ou lockd)"echo "(statd et/ou lockd)" fifi ;;;;'stop')'stop')