Systèmes d'exploitation - Le niveau utilisateur IUT de Villetaneuse Département Informatique - Free
←
→
Transcription du contenu de la page
Si votre navigateur ne rend pas la page correctement, lisez s'il vous plaît le contenu de la page ci-dessous
IUT de Villetaneuse Département Informatique 1ère année Systèmes d’exploitation Le niveau utilisateur (Volume horaire du cours + travaux dirigés + travaux pratiques : 40 heures) Pascal Coupey, bureau T209 email : Pascal.Coupey@iutv.univ-paris13.fr
2. Préambule
Préambule L'enseignement du système d'exploitation à l'IUT de Villetaneuse est constitué de 3 parties: Le niveau utilisateur (40 heures) Fondements et mise en oeuvre (40 heures) Administration de systèmes (20 heures) Cet enseignement doit apporter une bonne connaissance des systèmes d'exploitation multitâches, multi-utilisateurs tant au niveau de son utilisation qu'au niveau de sa structure interne et de sa mise en oeuvre. Il doit partir du postulat qu'une machine n'est pratiquement plus jamais isolée et montrer ainsi les liens avec l'enseignement du réseau. Le niveau utilisateur
Objectifs: Ce module est une introduction aux systèmes d'exploitation. La compétence recherchée consiste à savoir utiliser un système d'exploitation multitâches, multi-utilisateurs. Il doit aussi permettre de comprendre les étapes qui amènent à obtenir un programme en exécution à partir d'un programme en langage source. Remarques: Ce module ne nécessite aucun pré-requis sauf des notions d'algorithmique pour les scripts et de programmation en langage C. Mise en oeuvre: L'enseignement inclut une part importante d'applications par une programmation en langage shell et en C.
Plan du cours Page de garde Préambule L'enseignement du système Le niveau utilisateur Présentation des systèmes d'exploitation Introduction Structure du SE Interface utilisateur Les systèmes d'exploitation à l'IUT Terminal Présentation d'Unix Introduction Structure d'Unix Débuter sous Unix Système de fichiers sous UNIX Les commandes Unix Les caractères génériques Le caractère backquoting "`" Les caractères de neutralisation Quelques commandes UNIX Fichiers Types et protections Modifications des protections Système de fichiers (file system) Les liens La redirection des entrées-sorties Les tubes de communication Les interpréteurs de commandes Introduction Les variables de l'interpréteur • En Bourne shell • En C-shell • Liens avec le C Les fichiers d'initialisation Cycle programme
Introduction Du source à l'exécutable Le portage Les erreurs Variables en mémoire Processus Introduction Le parallélisme Utilité Problèmes Partage de l'UC Création d'un processus (sous UNIX) Distinction père, fils Changer le code d'un processus Quelques commandes et fonctions utiles Programmer en shell Introduction Le langage C-shell suivant
3. Présentation des systèmes d'exploitation
Introduction Contexte: Multitâches, multi-utilisateurs Plusieurs programmes s'exécutent "en même temps" (multi-tâches) Plusieurs utilisateurs (multi-utilisateurs) Objectifs: Libérer les utilisateurs Utilisation commode et efficace du matériel Gestion de toutes les ressources de la machine (mémoire, périphériques, ...) Partage équitable des ressources en toute sécurité
Structure du système d'exploitation
Interface utilisateur Dialoguer avec le système = transmettre des commandes Interpréteur de commande peu convivial puissant langage de programmation ex: command.com et fichiers .bat (MsDos) sh, csh, tcsh, bash, ... + scripts (UNIX) Appels systèmes ((en langage C) ex: chdir, mkdir, open, ...) Interface graphique: icônes, menus, fenêtres, ... convivial moins efficace moins puissant ex: Windows (Microsoft) Xwindow, Openwin, CDE, ... (UNIX)
Les systèmes d'exploitation à l'IUT
Terminal Un terminal est un dispositif capable d'envoyer des caractères à l'ordinateur et d'afficher les résultats à l'écran. Un terminal alphanumérique est en mode texte uniquement. Il faut dissocier terminal et ordinateur Terminal relié à un ordinateur distant (ex à l'IUT: HPUNIX, VMS). Les commandes sont exécutées sur l'ordinateur distant. Terminal relié à un ordinateur local (ex à l'IUT: LINUX, MSDOS). Les commandes sont exécutées sur l'ordinateur local. Pour UNIX (LINUX) il est toujours possible d'ouvrir un terminal relié à un ordinateur distant relié au réseau.
4. Présentation d'UNIX
Introduction UNIX est un système multi-tâches, multiutilisateurs en temps partagé Succès d'UNIX: Gratuité Adoption universitaire Standard Portabilité Historique: 1969: Bell Laboratories (AT&T) (K.Thomson,D.Ritchie) 1973: 1ère version écrite en C (portabilité) 1974: UNIX de Berkeley (BSD) et UNIX AT&T (System 5) 1984: Norme Xwindow (indépendante d'UNIX) 1987: Accord pour convergence de UNIX BSD et UNIX System 5 en Norme POSIX= intersection 1988: Deux consortiums: OSF: Normalisation d'UNIX : OSF1 UNIX international : UNIX System 5 à l'IUT: LINUX (compatible System 5)
Structure d'UNIX Interface UNIX Bibliothèques de programmes exécutables: les commandes Des shells (interpréteurs de commandes) Langage de commandes (scripts) Utilitaires Assembleurs, éditeurs de liens. Compilateurs (C, PASCAL, ADA, JAVA, ...) Traitements de texte (LATEX) Des outils de mise au point de programmes Des éditeurs de textes (ed, vi) Un système de messagerie Un analyseur syntaxique ...
Débuter sous UNIX Connexion: Login: coupey Passwd: ******** (avec au moins un chiffre) $ (prompt UNIX) Deconnexion: $logout Début de session: Login (répertoire privé = répertoire de travail = /home/...) Puis Boucle interpréteur sous LINUX (bash ou tcsh)
Système de fichiers sous UNIX Sous UNIX: Une arborescence : LA racine (/) Sous DOS: Plusieurs arborescences: A: B: C: ... /etc : fichiers de configuration système /home : répertoires utilisateurs /dev : fichiers spéciaux /var : fichiers temporaires pour les files d'attente et les fichiers de mail. /usr : l'ensemble des commandes et des programmes /sbin : exécutables pour l'administration système
Les commandes Unix nom-de-commande options paramètres ls -l *.c Plusieurs commandes sur une ligne séparées par des ";": ex: ls; date; who Une commande sur plusieurs lignes en tapant "\" avant le le return: ex: grep "blablablablablablablablablablablablablablabla" \ essai.txt Valeur de retour d'une commande: 0 si OK != 0 sinon ex: rm texte.doc renverra 0 si le fichier texte.doc existe, un code !=0 sinon Regroupement de commandes (.....): ex: (date; ls; who) > essai redirige le résultat des commandes date, ls et who dans le fichier essai date; ls; who > essai seul le résultat de who est redirigé vers essai
Les caractères génériques * : 0 ou plusieurs caractères quelconques ex: ls *.c liste tous les fichiers qui se terminent par .c ? : 1 caractère quelconque ex: ls tp?.pas liste tous les fichiers de trois caractères commençant par tp et d'extension .pas [a,b] ou [ab] : 1 caractère a ou un caractère b ex: ls [c,l]* liste tous les fichiers et répertoires qui commencent par c ou l {ab,cd} : la chaîne ab ou la chaîne cd ex: ls {ab,cd}* liste tous les fichiers et répertoires qui commencent par ab ou cd [a-zA-Z] : 1 caractère alphabétique minuscule ou majuscule [1-9A-Z] : 1 caractère numérique ou alphabétique majuscule ex: ls [a-z][0-9] liste tous les fichiers et répertoires de deux caractères commençant par une minuscule suivi d'un caractère numérique
Le caractère backquoting "`" ` ` : ce caractère permet d'utiliser le résultat d'une commande comme argument d'une autre commande ex: echo pwd pwd echo 'pwd' pwd echo `pwd` /home/pc echo "pwd" pwd echo "ma machine est `hostname` je suis l'utilisateur `whoami`" grep `whoami` *
Les caractères de neutralisation \ : neutralise le caractère spécial qui suit ex: ls pas\*.c liste uniquement le fichier pas*.c s'il existe ' ' : neutralise une chaîne de caractères ex: ls 'pas*?1.c' liste uniquement le fichier pas*?1.c s'il existe " " : idem mais certains métacaractères sont interprétés comme l'évaluation d'une commande ex: echo 'nous sommes le : `date`' nous sommes le : `date` echo "nous sommes le : `date`" nous sommes le : lun 19 nov
Quelques commandes UNIX man: afficher le manuel (ex: man ls) cd: changer de répertoire (ex: cd .., cd /home/users/coupey, cd ~coupey, cd) pwd: afficher le répertoire courant mkdir: créer un répertoire rmdir: supprimer un répertoire ls: lister les répertoires et fichiers (ex: ls -l) more: afficher le contenu d'un fichier page par page cp: copier un fichier (ex: cp essai /home/users/coupey, cp ../essai .) mv: changer le nom d'un fichier ou d'un répertoire (ou déplacer un fichier ou un répertoire) rm: supprime un ou plusieurs fichiers touch: créer un fichier vide (ex: touch essai) grep: recherche d'une chaîne dans un fichier (ex: grep init lisezmoi.txt)
5. Les fichiers
Types et protections Types de fichier ordinaire (-) répertoire (d) spécial: mode caractère (c) spécial: mode bloc (b) tube nommé (p) lien symbolique (l) socket (s) Protections (droits) 3 types d'utilisateurs 3 modes principaux (fichiers et répertoires) le propriétaire (u) écriture (w) membres du groupe (g) lecture (r) les autres utilisateurs du système (o) exécution (x) Exemple $ ls -l /etc/passwd -rw-r--r-- 1 root bin 2055 Jul 28 18:03 /etc/passwd
Précisions sur les droits des répertoires R autorisation de lister les fichiers du répertoire (ls) X autorise l'accès au répertoire (cd) autorise la modification du répertoire c'est à dire création, suppression, changement de nom W des fichiers et des répertoires du répertoire
Modifications des protections Modifications des droits exemple: chmod ug+rx titi exemple: chmod 660 toto (660 = rw-rw----)
Le masque (protection par défaut à la création d'un fichier ou répertoire) masque = l'inverse des permissions exemple: par défaut rw- r-- --- 110 100 000 masque 001 011 111 1 3 7 Mais le système tient compte du bit X uniquement pour les répertoires. masque 0 2 7 Pour un nouveau fichier les droits seront: rw- r-- --- Pour un nouveau répertoire les droits seront: rwx r-x --- Changer le masque: commande umask (ex: umask 027)
Modifications du propriétaire et du groupe chown nouveau-propriétaire fichier chgrp nouveau-groupe fichier exemples: chgrp bin toto change le groupe de toto en bin chown root titi change le propriétaire de titi en root (attention opération à sens unique)
Système de fichiers (File System sous Unix) 1 file system = 1 table d'inodes à 1 fichier est associé 1 inode (unique par file system) exemple: ls -i toto 6330 toto (6330 est le numéro d'inode) La commande df permet de visualiser tous les file system
Les liens Un lien = deux noms sur un même fichier Lien physique (même file system) Lien symbolique (file system différents) ln fichier-existant nouveau-nom ln -s fichier-existant nouveau-nom Lien physique donc même inode donc Lien symbolique donc inode différents. Le lien contient le même file system texte du chemin vers le fichier exemple: exemple: $ ls -i $ ls -i /tmp/essai 6630 toto 5540 essai $ ln toto titi $ ln -s /tmp/essai essai1 $ ls -i $ ls -i 6630 toto 6323 essai1 6630 titi $ cp titi tutu $ ls -i 6630 titi 6630 toto 6631 tutu
La redirection des entrées-sorties entrée standard n°0 par défaut le clavier sortie standard n°1 par défaut le terminal actif (l'écran ou fenêtre active) sortie des erreurs n°2 par défaut le terminal actif (l'écran ou fenêtre active) > Redirection de la sortie standard >> Redirection de la sortie standard avec concaténation < Redirection de l'entrée standard 2> ou >& Redirection des messages d'erreurs en shell (2>) et en c-shell (>&) ls > toto met le résultat de ls dans le fichier toto users >> toto concatène en fin du fichier toto le résultat de la commande users cat < f1 > f2 copie f1 dans f2 ls > tutu more < tutu affiche le contenu des fichiers dont les noms sont dans tutu mail Dupond < lettre.txt un mail est envoyé à Dupond à partir du contenu du fichiers lettre.txt ls -l > temp1; grep "rwxr-xr-x" < temp1 > temp2; more temp2 ; rm temp1 temp2 liste, page par page, tous les fichiers du répertoire courant qui ont comme droits rwxr-xr-x echo "bonjour" > /dev/pts/2 affiche "bonjour" dans la fenêtre 2 (dans le cas où deux fenêtres de commandes sont ouvertes) rm lettre.txt 2> erreur.txt redirige le message d'erreur vers erreur.txt (le fichier lettre.txt n'existe pas) cat erreur.txt aucun fichier ou répertoire de ce type
Les tubes de communication Un tube de communication est un flot de données qui permet de relier la sortie standard d'une commande à l'entrée standard d'une autre commande sans passer par un fichier temporaire exemples ls -l | more affiche page par page le résultat de la commande ls last | grep coupey | head affiche les dix dernières connexions sur la machine de l'utilisateur coupey ls -l | grep "rwxr-xr-x" | more affiche page par page la liste des fichiers qui ont les droits rwxr- xr-x. Cette commande donne le même résultat que ls -l > temp1; grep "rwxr-xr-x" < temp1 > temp2; more temp2; rm temp1 temp2 Avantages des tubes Toutes les commandes liées par le tube s'exécutent en parallèle. Par exemple, dans la commande ls -l | more la commande more récupère, au fur et à mesure, les lignes produites par la commande ls alors que dans la commande ls -l > toto; more toto , la commande more n'affichera toto que lorsque le ls sera terminé. Il n'y a pas de limite de taille pour le flot de données qui transite dans le tube (car il n'y a pas de fichier temporaire)
6. Les interpréteurs de commandes
Introduction Un interpréteur de commande (shell) est un programme qui prend en charge l'utilisateur après le login. Lors de la connexion d'un utilisateur, il y a exécution d'un programme ( bash ou sh ou csh ou tcsh ou ksh ou ... en fonction de ce qui est défini dans le fichier /etc/passwd) Objectif: Traduire les commandes saisies par l'utilisateur afin que le système puisse les exécuter
Catégories de commandes: Commandes définies par un alias (pas d'exécution de programme associé à la commande) alias ls='ls -F' en bash alias rmi rm -i en c-shell Commandes internes au shell (pas d'exécution de programme associé à la commande) set, cd, echo, pwd, alias, ... Commandes externes indépendantes du shell (elles sont dans /usr/bin, /bin , ...) , il y a exécution d'un programme associé à la commande cp, rm, ls, ...
Les variables de l'interpréteur Variables globales de l'interpréteur Variables internes: connues uniquement de l'interpréteur Variables d'environnement: connues de l'interpréteur et des commandes lancées à partir de l'interpréteur exemples: PATH PROMPT HOME PRINTER LOGNAME SHELL DISPLAY
En Bourne-shell (Bash) Affectation d'une variable interne nom-variable=valeur HOME=/home/xstra PATH=/bin:/usr/bin:/usr/contrib/bin x=3 RDV=monagenda La déclarer comme variable d'environnement export nom-variable IMPRIMANTE=laser export IMPRIMANTE Lecture set affiche toutes les variables et leur valeur env et printenv affichent uniquement les variables d'environnement Utilisation $nom-variable echo $IMPRIMANTE laser Suppression unset nom-variable unset IMPRIMANTE
En C-shell Affectation d'une variable interne set nom-variable = valeur set home=/home/xstra set path=/bin:/usr/bin:/usr/contrib/bin Affectation d'une variable d'environnement (par convention en majuscules) setenv nom-variable valeur ex: setenv IMPRIMANTE laser Lecture set affiche toutes les variables internes et leur valeur setenv et printenv affichent uniquement les variables d'environnement Utilisation $nom-variable Suppression unset nom-variable ex: unset path unsetenv nom-variable unsetenv * supprime toutes les variables d'environnement
Liens avec le C Par le main: Le paramètre arge est un tableau de chaînes "nom-variable=valeur" int main (int argc, char *argv[], char *arge[]); argc : nombre d'arguments argv : les arguments arge : variables d'environnement Exemple: essai 1 2 trois à l'entrée du programme essai argc = 4 argv = ""essai" "1" "2" "trois"" arge = ""PATH=/bin:/usr/bin:/usr/contrib/bin" "IMPRIMANTE=laser" ..."
Les fichiers d'initialisation En bourne-shell: /etc/profile fichier commun à tous les utilisateurs exécuté à la connexion .bash_profile fichier de l'utilisateur (dans son répertoire d'accueil) exécuté à la connexion .bashrc fichier de l'utilisateur (dans son répertoire d'accueil) exécuté à chaque bash .bash_logout exécuté à la sortie de la session PS1="`hostname`:`whoami`>" PATH=/bin:/usr/bin:/etc:/usr/contrib/bin:. LOGNAME=`whoami` ... En C-shell: .login exécuté à la connexion (définition des variables d'environnement, initialisation de la variable TERM) .cshrc exécuté à chaque exécution d'un c-shell (csh) (définition et initialisation des variables internes au c-shell, définition des alias) .logout exécuté à la sortie de la session exemple d'un .cshrc: exemple d'un .logout set path=(/bin /usr/bin /etc/usr/local/bin) echo "********** fin de session **********" set mail=(10 /usr/mail/`whoami`) find $HOME -name core -exec rm{}\; set prompt='LinuxIUT>' ... alias del 'rm -i' alias dir 'ls -l'
7. Le cycle programme
Introduction du code source à l'exécutable Hiérarchie des langages langage machine langage d'assemblage langages évolués Traducteurs code source ====> code cible Programme-fichiers avec un fichier principal (Notion de projet)
Du source à l'exécutable 1. Compilation ==> Résultat = programme objet Pré-compilation (fichier par fichier) (Le résultat est encore en langage source) Traitement des macros (#define, #include, ...) Traduction du code source en langage d'assemblage (fichier par fichier) Références externes (ex: appels de fonctions externes) Références relogeables références absolue (ex: mov ax, data (reférence absolue)) références à du code dont la position dans le programme complet est non connu (par exemple un branchement) Assemblage (fichier par fichier) langage d'assemblage ==> langage machine création des en-têtes 2. Edition des liens (tous les fichiers ensemble) ==> Résultat = Prog. exécutable Résolution des références externes Ajout des bibliothèques Les références absolues non encore résolues 3. Chargement Déterminer une adresse de chargement en mémoire centrale pour le programme exécutable Résolution des références absolues Saut au point d'entrée
Le portage
Les erreurs Compilation: erreurs de syntaxe (ex: oubli d'une } ou d'un ;) Edition des liens: problèmes de références externes (ex: oubli d'une bibliothèque) Exécution: problèmes de conception (ex: boucle infinie)
Variables en mémoire Portée + Durée de vie = classe de variable En langage C: Portée variable dans un bloc: Variable locale au bloc variable hors de tout bloc: Variable globale à un fichier (static) ou à plusieurs fichiers (extern ou rien) Durée de vie automatique: allouée sur la pile, espace libéré si plus accessible statique: espace réservé jusqu'à la fin de l'exécution alloué en zone des données Variable locale: automatique ou statique (si static) Variable globale: nécessairement statique Fonctions: statiques et globales Cas particulier: Allocation dynamique en zone des données (ex: malloc)
Exemples _________________________________________________________________________________________________________________________ /* fichier mymain.c */ extern int tab[ ]; globale à tout le programme, statique, pas d'espace réservé int i,j=0; variables globales à tout le programme et statiques. Pour i, espace réservé en zone des données non initialisées et zone des données initialisées pour j. int code(int c); fonction globale à tout le programme, définie dans un autre fichier .... _________________________________________________________________________________________________________________________ /* fichier util.c */ int tab[50]; variable globale à tout le programme et statique. 50 entiers en zone des donnés non initialisées static int aux[29]={11,32,53,...}; variable globale au fichier util.c et statique. 29 entiers en zone des données initialisées int code (int c) fonction globale à tout le programme et statique { static int num; variable locale à code et statique, espace réservé en zone des données jusqu'à la fin de l'exécution. int temp; variable locale à code et automatique alloué sur la pile ... }
8. Les processus
Introduction Un processus est une abstraction d'un programme en exécution ou encore Un processus est un objet indépendant associé à un programme en exécution exemples: more toto création d'un processus en avant plan associé à la commande more emacs titi & création d'un processus en arrière plan associé à l'éditeur emacs essaitd1 & création d'un processus en arrière plan associé à l'exécutable essaitd1 à un même programme peut être associé plusieurs processus: par exemple le compilateur ou un programme de réservation de billets SNCF Chaque processus a son propre compteur ordinal, ses propres registres, ses variables, son pointeur de pile, ses fichiers ouverts, ... On trouve les processus sur les systèmes multitâches. Multitâches = plusieurs tâches (processus) peuvent s'exécuter en "même temps" exemples: UNIX, OS2, Windows NT, Windows 2000, VMS Sur un système multitâches toute unité d'exécution est un processus (tout est processus) exemple: les DAEMONS sont des processus système en attente de requête à traiter (IMP, MAIL, ...) Donc les programmes système + programmes utilisateurs en exécution sont un ensemble de processus qui naissent, vivent leur vie, communiquent et meurent...
Le parallélisme "Indépendance", en "même temps" indiquent un certain parallélisme d'exécution Deux types de parallélisme: Le "vrai" parallélisme: deux activités au même instant Plusieurs UC Entrées-sorties // UC Le "pseudo" parallélisme: partage de l'UC entre les processus Récupérer le temps des entrées-sorties Temps partagé: allouer l'UC par tranche de temps Les processus sont des spécialistes indépendants qui coopèrent éventuellement avec d'autres processus. Toute la difficulté réside dans la communication des processus, leur synchronisation et le partage des ressources (UC, disques, mémoire, etc.)
Utilité Au niveau système simplification de la conception: ensemble de spécialistes qui interagissent maintenance: si problème, cf. le spécialiste associé clarté et visibilité: chaque service (ensemble de processus) est clairement défini avec des noms clairs et parlants adaptation: ne pas utiliser une partie du système => ne pas exécuter les spécialistes associés performances: grâce au parallélisme. Un processus met à jour des données sur un disque pendant qu'un autre affiche des données à l'écran et qu'un autre enfin envoie un mail exemple: 2 programmes P1 = lecture disque (50) + exécution (100) + impression (100) P2 = exécution (50) + impression (50) + lecture disque (50) + exécution (100) tps total = P1 + P2 = 500 si aucun parallélisme tps total = P1 || P2 = 250 si parallélisme
Au niveau utilisateur Aspects génie logiciel (1 processus = un spécialiste) maintenance réutilisabilité clarté du code Performances: grâce au parallélisme Transparence / réseaux: exemple du client-serveur Xwindow exemple: trier le fichier f1 sur le disque 1 = 100 trier le fichier f2 sur disque 2 = 100 fusionner f1 et f2 en f3 = 50 Un seul processus plusieurs processus trier(f1) créerprocessus(trier f1) trier(f2) créerprocessus(trier f2) fusionner(f1,f2) attendre fin des tris fusionner(f1,f2) temps = 250 temps = 150
Problèmes Communiquer: Des processus qui coopèrent doivent pouvoir communiquer, se synchroniser Partager les ressources: Des processus partagent l'UC, la mémoire, des fichiers, des variables, ... exemple: ==> deux primitives de synchronisation de processus: P (pour réserver une ressource) et V (pour la libérer) exemple: P(place); se-garer; pour occuper la place si elle est libre, en attente si place occupée V(place); pour libérer la place, débloque le premier processus bloqué
Partage de l'UC activer: Donner l'UC. C'est l'ordonnanceur qui s'occupe de choisir un processus prêt. désactiver: Le processus a utilisé son crédit d'UC mise en attente: le processus attend un évènement (ex: fin d'entrée-sortie) fin d'attente: l'évènement attendu par le processus est arrivé. ==> 3 états en attente (ou bloqué) prêt (à recevoir l'UC) actif (élu): en exécution
Création d'un processus (sous UNIX) exécution d'une commande L'exécution de pratiquement toutes les commandes donne lieu à la création d'un processus exemple: cat chapitre1 chapitre2 chapitre3 | grep arbre ==> deux processus qui communiquent à travers un "tube" (pipe). Dans l'exemple la sortie du cat est l'entrée de grep grep peut être "en attente" si cat n'a pas produit de lignes ...
l'éxécution de tout programme donne lieu à la création d'(au moins) un processus. le chargement du système donne lieu à la création de plusieurs processus (INIT, MAIL, IMP ...) la primitive C fork() permet la création d'un processus clone du père (c'est à dire le processus associé au programme qui exécute le fork()). /*programme essai */ main() { printf("coucou avant création"); fork(); printf("coucou après creation"); } $essai "coucou avant création" "coucou après création" "coucou après création" main () main () {fork(); ==> combien de processus? {fork(); ==> combien de processus? fork();} fork(); fork();} Chaque processus créé est identifié par un numéro unique: son PID
Distinction père, fils Grâce à la valeur de retour du fork Si la valeur de retour est 0 alors c'est le fils Si la valeur de retour est >0 alors c'est le père (la valeur est le pid du fils) Si la valeur de retour est 0) {/* c'est le père */} else {/* c'est le fils (pid ==0) */} } La fonction getpid() permet à un fils de connaître son propre PID La fonction getppid() permet de connaître le PID de son père. Tous les processus sont organisés sous forme d'un arbre dont INIT est la racine. Chaque processus a un et un seul père.
Changer le code d'un processus int execlp(const char *path, const char *arg0, ..., const char *argn, char*); ==> Permet de faire exécuter un autre programme à un processus Attention: Les instructions qui suivent execl ne seront jamais exécutées. exemple: main() { int pid; pid = fork(); if (pid < 0) {/* problème */} else if (pid == 0) { execlp("~/bin/chess","chess",NULL); printf("coucou");} printf("coucou je suis le père"); } ==> Le processus fils exécutera le programme exécutable " chess" après l'éxecution de l'instruction execlp au lieu du programme associé à son père. ==> Le printf("coucou") ne sera pas exécuté.
Quelques commandes et fonctions utiles ps: visualiser les processus kill: détruire un processus. exemple: kill 17142 &: lance un processus en arrière plan. exemple:essaitd & ctrl c: détruit le processus qui tourne en avant plan (=kill -9) ctrl z: suspend le processus qui tourne en avant plan jobs: visualiser les travaux (programmes en exécution) qui dépendent d'un shell. fg: fait passer un travail d'arrière plan en avant plan. bg: fait passer un travail d'avant plan en arrière plan. wait: (fonction C) permet à un père d'attendre la terminaison de l'un de ses fils. sleep(T): (fonction C) suspend un processus pendant un temps T.
9. Programmer en shell
Introduction Le shell est à la fois un interpréteur de commande et un langage de programmation Un fichier en langage shell est un script (fichier de commandes) Le langage shell: instructions variables Instructions Toutes les commandes UNIX L'invocation de programmes exécutables (ou de scripts) avec passage de paramètres Assignation de variables Instructions conditionnelles et itératives Instructions d'entrée-sortie Remarques Le shell est un langage interprété Il est possible d'invoquer un script dans un shell (ex: csh) à partir d'un autre type de shell (ex: bash) La première ligne d'un script doit être le nom du shell qui doit être invoqué (ex: #!/bin/bash)
Le langage bash Avantages du bash Syntaxe riche Compatible avec le Bourne shell Définitions de fonctions Gestion de l'historique Utilisation des alias Utilisation des tableaux Plus fiable que le csh Évaluation d'expressions arithmétiques facile Inconvénient: Une certaine lenteur d'exécution, comme tous les shells Syntaxe (complémentaire) du bash Lecture d'une variable read variable >read a bonjour >echo $a bonjour Création d'un alias salias nom=valeur >alias rm='rm -i' >alias cx='chmod u+x' >cx toto
Tableaux de variables (listes) liste=(... ... ... ...) >arbres=(acacia sapin meloze aulne hêtre chêne) >echo ${arbres[*]} acacia sapin meloze aulne hêtre chêne >echo $arbres[3] aulne >echo ${#arbres[*]} 6 Structures de contrôle (1=vrai 0=faux): une expression booléenne de contrôle est sous la forme [[ exp ]] ou (( exp )) pour les expressions arithmétiques If expression case valeur in then label) commandes ;; commande ... ... [*) commandes ] [elif expression ; then esac commande ...] while expression [else do commande commande ...] ... fi done for nom in liste for expression do do commande commande ... ... done done
Les tests sur les fichiers -x nom l'utilisateur a-t-il le droit en exécution? -r nom l'utilisateur a-t-il le droit en lecture? -w nom l'utilisateur a-t-il le droit en écriture? -e nom existe-il? -O nom l'utilisateur est-il propriétaire? -s nom est-il non vide? -f nom est-il standard? -d nom est ce un répertoire? Passage de paramètre $1 ... $n paramètres $0 le nom du script $* la liste des paramètres ($1 ... $n) $# le nombre de paramètres Opérations arithmétiques (( … )) + - * / ... x=32 y=8 (( z=$x + $y )) echo $x $y $z 32 8 40 echo $(( $x + $y + $z )) 80
Exemples de scripts script essaipar Script essaifor #!/bin/bash #!/bin/bash echo $0 a été appelé avec $# paramètres for x in $* echo qui sont : $* do echo $x done essaipar a b 1 2 essaipar a été appelé avec 4 paramètres qui sont : a b 1 2 script essaific script essaiarith #!/bin/bash #!/bin/bash if [[ $1 == "" ]] for (( x=0 ; x
FIN
Vous pouvez aussi lire