cours-système-2011-2012 [Mode de...
-
Upload
duongnguyet -
Category
Documents
-
view
217 -
download
0
Transcript of cours-système-2011-2012 [Mode de...
1
3ème année Licence d’Informatique
Programmation système
Philippe Lahire & G. MenezUniversité de Nice Sophia-Antipolis
Septembre 2011
Ce cours fait de nombreux emprunts à celui de R. Rousseau
Version Septembre 2011 N°2
Organisation du cours
1ère partie : outils de développementG. Menez : 3 premiers cours
2ème partie : prog systèmePlanning :
Cours: 9 séances (1h30)TP: 8 ou 9 séances (3h)
Contrôle continu :TP d à i TP éTP: deux à trois TP notésdeux partiels
Note complémentaire :Le travail : Motivation, Compréhension, Progression,…La tenue : Assiduité, Respect,…
Matériel : PC 3ème étage
2
Version Septembre 2011 N°3
Acquisition (cours Système de L2)
Notion de processus + API (fork, exec)Système de FichiersSystème de FichiersEntrée-sortie + API (read, write…)Tubes + API (pipe)Signaux + APISockets + API
Langage : • principalement python• complété par du C
Version Septembre 2011 N°4
Démarche proposée
Evaluation: compréhension des concepts acquis
Approfondissement des concepts vues
Reprise détaillée des concepts + complément
Apprentissage de nouveaux concepts
TPs plus approfondis en C
Adaptation de la rapidité en fonction de la compréhension
3
Version Septembre 2011 N°5
Organisation des enseignements
cours TP
1 Introduction + Entrées-Sorties E/S1 Introduction Entrées Sorties E/S
2 Entrées-Sorties + Syst. Fichiers Syst. Fichier
3 Syst. Fichiers Syst. Fichier
4 Processus Process.
5 Processus Process.
6 Tubes Tubes
7 Signaux Signaux
8 IPC-Système V IPCy
9
Selon avancement :• Ajout Thread posix + Gestion mémoire virtuelle• Programmation « réseau »
Version Septembre 2011 N°7
Tentative de bibliographie
1. S. Harbison & G. Steele Jr. C, a reference manual (1st ed. 1984) Prentice Hall, 2nd edition, 1987, 404 p.
2. B. Kernighan & D. Ritchie “The C Programming Language (1st ed. 1978)”,C g g g g g ( ) ,
Prentice Hall, 2nd ed., 1988. Traduction française Masson, 1990.3. A. Tannenbaum “ Systèmes d’exploitation : systèmes centralisés,
systèmes distribués” MacGraw Hill, 1990. Traduction française (2e ed) Dunod, 1999
4. A. Siberschatz & P. Galvin “ Operating Systems Concepts ”, 5e ed, Addison-Wesley, 1998.
5. J. Beauquier & B. Berard “Systèmes d’exploitation : concepts et algorithmes ” MacGraw Hill, 1990.
6. W. Stevens “Advanced Programming in the Unix environment” Addison Wesley 1992 744 p
Conc
epts
ix Wesley, 1992, 744 p.7. M.J. Bach “Conception du système Unix”, Prentice Hall, 1986. Traduction
française Masson, 1991.8. J.M. Rifflet “La programmation sous Unix”, Ediscience intern., 3ème éd.,
1993, 630 p.9. U. Vahalia “Unix Internals : the new Frontiers” Prentice Hall, 199610. A.D. Solomon “Le guide officiel sur l’architecture et le noyau Windows
NT” 2nd ed., Microsoft Press, 1998.11. Site microsoft
Uni
Win
dow
s
4
Version Septembre 2011 N°8
Documentation en ligne
Sur le langage CEn L2MI (Gilles Menez) : ( )
www-mips.unice.fr/˜menez/L2/L2cours.htmlCours vidéo sur le langage C de l’Université de Paris VI : www.infop6.jussieu.fr/cederoms/Videoc2000/
Sur la programmation réseau :Cours réseau du CNRS : www.urec.fr/coursCours programmation réseau avec sockets, de Brian "Beej" Hall :
hi d ˜b j id h lwww.ecst.csuchico.edu/˜beej/guide/net/html/.
A propos de l’UE «Programmation système et réseau» :Site web officiel de cet enseignement :http://deptinfo.unice.fr/~lahire/enseignement/SYSL3
Chapitre 1: Présentation générale
5
Version Septembre 2011 N°10
Chapitre 1: Présentation générale
Historique des systèmes UNIXVers une normalisation: POSIX
√Vers une normalisation: POSIXUnix propriétaires ou LinuxSurvol de l'architectureNoyau du systèmePrincipales caractéristiquesRappels des notions de base: le ShellRappels des notions de base: le ShellPrincipales commandesInterprétation de commandeNotion de base: La session, le manuel,…Parallèle avec Windows
Version Septembre 2011 N°13
Vers une normalisation: POSIX
Portable Open System Interface eXchange
Norme IEEE & Description:1003.0: Guide et présentation 1003.1: Bibliothèque de fonctions1003.2: Shell et utilitaires1003.3: Méthode de tests et conformité1003.4: Extension temps réel1003.5: Form. appels systèmes en ADA1003 6: Séc rité1003.6: Sécurité1003.7: Administration système1003.8: Accès commun aux fichiers1003.9: Interface sous Fortran 771003.10: Interface supercalculateurs
Normes: ISO 9945-1 ( P1003.1)
6
Version Septembre 2011 N°14
Unix propriétaires ou Linux…
Linus Torvald (FIN-91 sur i386)Philosophiep
Un noyau et des outils de base Indépendant de tout constructeur
Libre et Basé sur des contributions bénévoles (GPL)Organisation en projets ambitieux (FSF, SourceForge)Un grand nombre d'utilisateurs motivésUn “excellent produit”: stable et code original “libre de droits”
Porté un grand nombre d'architectures : SPARC, INTEL, ALPHA, MAC, …
Quelques projets: ApacheGnomeGNU
Version Septembre 2011 N°15
De nombreuses distributions Linux
Les différencesNom: Debian, Redhat, Suse, Mandrake, …Prix (commerciale ou pas), Nombre de logiciels, Versions des logiciels, Pilotes supportés,Organisation des fichiers de configuration, Procédures d'installation, Sérieux de la gestion (site web, mise à jour, etc.), Fréquence des versionsqCertifications, …
Mais encore:Debian: de 4500 à 9000 Logiciels,Orienté informaticien,Une dérive vers l'automatisation, …
7
Version Septembre 2011 N°16
Survol de l'architecture (1)
UTILISATEURInterface Utilisateur
SYSTEME D’EXPLOITATION UNIX
BIBLIOTHEQUE STANDARDfopen, fclose, fread, fwrite,…
PROGRAMMES UTILITAIRES STANDARDShell, éditeur, compilateur, …
Interface Bibliothèques
Interface Appels Systèmes
Interface Utilisateur
MATERIEL: UC, mémoire, disques, terminaux, etc…
SYSTEME D’EXPLOITATION UNIXGestion des processus, de la mémoire, des E/S,…
Autre système en couche : logiciels réseaux suivant norme - OSI
Version Septembre 2011 N°19
Noyau du système
BibliothèquesProgramme Utilisateur
Interface des appels systèmes
Sous-systèmes de contrôle de fichiers
Sous-systèmes de contrôle des processus
Communication interprocessus
Ordonnanceur
Gestion mémoire
Cache Buffer
PARTIE MATERIELLE
Cache Buffer
BlocCaractèreContrôleurs de périphériques
Contrôle de la partie matérielle
8
Version Septembre 2011 N°21
Principales caractéristiques
Langage de haut niveauLe noyau : plus d'1 million de lignes de Cy p g
Expressivité et simplicité de l'interfaceConstruction de programmes: des primitives élémentairesUn système de fichiers « hiérarchique »Un format cohérent de fichier (octet)Accès aux périphériquesccès au pé p é quesMulti-utilisateurs et multitâches …Indépendance avec l'architecture matérielle
54 % du codeMémoire virtuelle (versions actuelles)
Version Septembre 2011 N°23
Notion d’interprète de commandes
Shell : Interface textuelle vers le système
FonctionnalitésFonctionnalités
Message d'invitation (prompt)
Attend la saisie d'une commande
Commandes internes
Commandes externes (charg. + exec. programmes)
Historique des commandes précédentesHistorique des commandes précédentes
Redirections et tubes
Structures de contrôles (boucles, tests, fonctions, ...)
Mécanisme d'alias, variables d'environnement
Gestion de processus
9
Version Septembre 2011 N°24
Différents shells unix possibles
Bourne shell (historiquement, le 1er)
Toujours utilisé par les scripts internes du systèmeToujours utilisé par les scripts internes du système
C-shell (csh, tcsh)
syntaxe différente
Évolutions du Bourne shell
ksh (Korn shell)
bash (Bourne Again shell): le shell du projet GNU
Où indiquer le shell par défaut ?
bash (Bourne Again shell): le shell du projet GNU
zsh: Évolution prétendument "ultime" du bourne shell
Améliorations : historique, complétion, ...
Possibilité de (demander à) changer le shell par défaut
lancé automatiquement au début de session
Version Septembre 2011 N°25
Quelques éléments d’administration
/etc/passwdnom_du_compte : mot_de_passe : numero_utilisateur : numero_de_groupe :
commentaire : répertoire : programme de demarrage
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/bin/bash
daemon:x:2:2:daemon:/sbin:/bin/bash
news:x:9:13:News system:/etc/news:/bin/bash
user1:x:500:100:Mr User 1......:/home/user1:/bin/bash
commentaire : répertoire : programme_de_demarrage
/etc/groupnom_de_groupe : champ_special : numero_de_groupe : membre1, membre2
root:x:0:rootbin:x:1:root,bin,daemondaemon:x:2:users:x:100:
10
Version Septembre 2011 N°30
Caractéres spéciaux du shell
Certains caractères ont une signification spéciale pour le shell
* : 0 ou plusieurs caractères quelconques
Pas en C
p q q
t*o : nom de fichier qui débute par t et finit par o
? : 1 (et un seul) caractère quelconque
t?t? : désigne toto ou titi ou ttta, ...
\ : enlève la signification spéciale du caractère qui suit
t\*to : désigne t*to
Certaines constructions ont une signification spéciale
[a-z] : un caractère entre a et z (a ou b ou c ... ou z)
[aefgij] : un caractère (et un seul) parmi a,e,f,g,i,j
t[oau]t[oau] : toto, ou totu, ou tata, ou tato, ...
{mot1,mot2} : soit mot1, soit mot2
Version Septembre 2011 N°36
Notions de base: Le manuel
Principales sections (environ 20 Mo)taille dépendante des paquetages - nyx : (≈20 Mo de “.gz”)man1: Commandes utilisateurs à partir shell (≈1800)man2: Primitives du noyau (≈250)man3: Routines C (≈1400)man4: Fichiers spéciaux: les pilotes des périphériques (disque dur, clavier/écran, graveur, lecteur de dvd, zip, mémoires usb...) (≈90)man5: Formats de fichiers et protocoles (≈200)man7: Format des systèmes de fichiers, jeux de caractères, macros, nroff... (≈80)man8: Commandes d’administration – à partir shell (≈450)man9: routines du noyau non standards (≈90)
Attention : Un ordre d'évaluation Base whatis: recherche de commandesapropos: recherche de mots clés
11
Version Septembre 2011 N°37
Anatomie d’une page de manuel (1)
Section
Brè ve de scr ip t ion
Syn taxes possibles
Descr ipt ion détaillée de la comman de
Pr om p t d u « PAGE R »
De scr ip t ion d é t a illé e d e sop t ion s (or d r e a lp h a b .)
'q ' : q u it' b ' : r e tou r 1 p .< s p c > : d é fil 1 p .< e n t e r > : d é fil 1 l./xy : r e c h e r c h e r « xy »
Version Septembre 2011 N°38
Anatomie d’une page de manuel (2)
A i éAutr es pages in téressan tessu r un su jet voisin
N u l n ' e s t p a r fa it . . .
Par fois am bigu ës ou con fu sesVer sion angla ise (défau t ) :unset LANG LC_ALLpu is m an à n ouveau...
12
Version Septembre 2011 N°40
Principe général d'utilisation/* Fichier Z2.h */
Z1.oR1 (int i)Zlib.a
main (){
}........R1 (23)
/* Fichier Y.c */
#include "Z2.h"
Z2.o
Z3.o
........R1 (int i) {......}.......
PREPROCESSEUR
/* MAN !!!!! */
man r1
}
a.out
Y.o
EDITION DE LIEN
COMPILATION
Version Septembre 2011 N°41
Exception vs compte-renduPresque toutes fonctions/appels systèmes
Traitement standard des erreurs (1)
entierpointeur…Presque toutes fonctions/appels systèmes
Utilisation de errno :Syntaxe : extern int errno ;n◦ dernière erreur détectée par un appel système
• normale : positive ou nulle, non void ,• anormale : négative ou void
n dernière erreur détectée par un appel systèmepas remise à zéro à chaque appel. intro(2) : liste des différents codes
Méthodologie : test compte-rendu + errno
13
Version Septembre 2011 N°42
Fonctions associées#include <string.h>
Traitement standard des erreurs (2)
#include string.hchar* strerror (int errnum)retourne message « en clair » associé à errnum
#include <stdio.h>void perror (const char* message)affiche message message associé à errno (stderr)affiche « message » + message associé à errno (stderr)
Méthodologie :utiliser en s’appuyant sur « man » (Errors / Erreurs)ou traitement ad hoc (ex: gestion paramètres de « main »)
Version Septembre 2011 N°43
Exemple#include <string.h>
Traitement standard des erreurs (3)
g#include <stdio.h>int main (int argc, char* argv[]) {FILE* fichier;if (argc != xxx) {
fprintf(stderr, « nombre paramètres incorrect »);exit(1)
ici > 1
exit(1)}
if ( (fichier = fopen(argv[1], « rw »)) == NULL) {fprintf(stderr,«Erreur %i:%s \n », errno, strerror(errno));exit(2); }
}
14
Version Septembre 2011 N°44
Traitement des erreurs de W. Stevens (1)
+ return
format message d’erreur avec nb % + nb arguments
+ exit(1)
+ abort
Affiche aussi le message associé à errno
Macros : en majuscule et sans paramètrePas de message passé en paramètre mais :Affichage: Nom du fichier + numéro de ligne
Version Septembre 2011 N°45
Exemple#include <stevens.h> Pas par défaut dans linux
Traitement des erreurs de W. Stevens (2)
#include <stevens.h>#include <stdio.h>int traiter_fichier (char* f) {FILE* fichier; char tab[30];if ( (fichier = fopen(f, « rw »)) == NULL)
ERR_EXIT;
Pas par défaut dans linux
;…if (fclose(fichier)) != 0)
ERR_RETURN;}
15
Chapitre 2: Entrées - Sorties
Version Septembre 2011 N°47
Plan de travail
Principes généraux…
Structures internesHiérarchie de descripteursTables pour la gestion des entrées-sorties
Principaux appels systèmesOuverture / fermeture de fichiers: open closeOuverture / fermeture de fichiers: open, closeEntrées-sorties: read, writePositionnement : lseek, fseekDuplication en vue de redirection : dup, dup2
16
Version Septembre 2011 N°48
Mise au point / Survol
bash gcc emacs
int open (….) { } int read (….) { }
Tables :
FILE* fopen (….) { } Bien sur on se sert aussi du « shell »pour lancer un
programme
…
Système exploitation
Tables :•Fich. Ouvert•Volumes•Blocs•….
Consulte / met à jour« appelle » / exécute
processus
Version Septembre 2011 N°49
Principes généraux (1)
Sous UNIX: tout est fichierPériphérique réseau mémoire
Exemples : • « hardware » (/dev) • Accès au réseau (sockets)
T b i t t (FIFO)Périphérique, réseau, mémoire...Fichier = une suite d’octetsOrganisation : Hiérarchie de
Système de fichiers (partitions…)répertoiresFichiers « normaux » (en anglais Regular)
• Tubes persistants (FIFO) • Tables du noyau (TDF)
Montage : • local • distant
( g g )Liens entre fichiers (symboliques et physiques)Fichiers virtuels (/proc)Fichiers spéciaux (périphériques,FIFO,…)
17
Version Septembre 2011 N°50
Principes généraux (2)
Méthodes d’accèsSéquentiel (read)q ( )Direct - unité: l’octet – (lseek)
Protectionpropriétaire, groupe d’utilisateurs, les autresPas de journal (log) mais possibilité de verrous
Généralité + simplicitéImplantation de SGBD : bonne aptitudeImplantation de SGBD : bonne aptitudefichiers à trou, accès direct, octets…mécanismes additionnels non intégrés: évolution (gestion des versions), typage des
données, système transactionnel (SGBD),
Version Septembre 2011 N°51
Principes généraux (3)
Deux points de vuesUtilisateur (commandes, applications,…)( , pp , )Programmeur (C et appels systèmes)
Utilisateuréchanges entre un processus et des entités :
disque, machine distante, autre processus, terminal...
Programmeur Fichier au sens large
Echanges avec n’importe quelle entité par des flots d’octets consécutifsAccès direct possible sur des disques locaux ou distants (curseur lecture/écriture)
18
Version Septembre 2011 N°52
Principes généraux (4)
Une suite d’octetsDisque
Curseur
TamponDescripteur de fichier :
Prédéfini (fich Stand )
Mémoire Programme
F.D.
• Prédéfini (fich. Stand.)• A associer (open)
Simple numéro
Version Septembre 2011 N°53
Principes généraux (5)
Association (open…)Dans le programme Appel du programme
( p )nom externe / Desc. Fichier
chemin relatifchemin absolu
Pas de caractère générique
Utilisation (read, write…)chemin relatifchemin absolu
Desc. Fichier: numéro de voieobtenu par associationprédéfini :
0 : voie standard d’entrée1 : voie standard de sortie2 : voie standard d’erreur
On n’utilise jamais directement
Le clavier ou l’écran
19
Version Septembre 2011 N°54
Un modèle d’E/S adaptable aux langages
Impact:• Performance
Un modèle d’entrée sortie de bas niveauxLangage CJava…
• Utilisation…
Version Septembre 2011 N°55
Modèle langage C vs Modèle UNIX
Appels systèmes (1)open, lseek, write, stat...Mécanismes de base
Streams et routines C (2)isastream, fopen, fseek, fread, fwrite, fgets, feof, ...Notion de stream
Remarques et ConclusionMode noyau et Préemptiony p
struct FILE vs numéro d'entrée dans la TDFlect./écr. d'enregistrement vs d'octet(2) utilise (1)signatures de (2) indépendantes du système, mais l'implémentation dépend elle, du système ...
qu'en concluez vous ?
20
Version Septembre 2011 N°56
Qu'est-ce qu'un processus
DéfinitionsInstruction = indécomposable et indivisibleInstruction indécomposable et indivisibleProcesseur = ...Processus = exécution d'un programme
(instructions + données)Approche intuitive
UNIX = système "temps partagé“Plusieurs processus en même tempsUn seul processus actifAttente des autres (dans/hors mémoire)
Version Septembre 2011 N°57
Tables pour gérer les fichiers
P1 01
Position :État : N° inode :
Tables partagéesPrivé
P2 0
Proc
essu
s 12345
…
Nombre :…
Position :État :Nombre :
Nb. copies :Inode Infos ……
N° inode :Nb. copies :Inode Infos …
…
Tables Descripteurs Fichiers
…
Position :Ét t
Table fichiersEspace utilisateur Table inodes
Proc
essu
s P 0
12345
…
…
N° inode :Nb. copies :Inode Infos …
État :Nombre :…
Position :État :Nombre :
21
Version Septembre 2011 N°58
Modèle UNIX - Synthèse
Trois points de vues Le processus
Rôles :Gestion des voies d’échangep
L’usageLe « fichier »
Deux abstractions (par point de vue)Processus : Usage et nature du fichierUsage : raison de l’utilisation par le processus
et la nature du fichier
gGestion du curseur…Gestion des protections…
« Fichier »: raison de l’utilisation et usage du fichier
Permettre le partageD’un même usage par un/plusieurs processusD’un même fichier par un/plusieurs processusD’une même fichier par un/plusieurs usages
Version Septembre 2011 N°59
Ouverture/Création d’un fichier: open
Descripteur de fichier
Lors de la création: f(perm,umask)
Mode d’ouverture
Nom fichier
fichier
Mise à jour des tables internes (processus + noyau)Oflags/perm : 9/15 macros dans les fichiers .h
Un petit ensemble de combinaisons validesLes incohérences ne sont pas détectés
22
Version Septembre 2011 N°60
Ouverture/Création: open (oflags)
O_CREAT: création, si le fichier n’existe pasO EXCL: combiné avec O CREAT, création si le fichier n’existe
Valeurs possibles
_ _ ,pas, erreur sinonO_RDONLY: ouverture en lecture seule. O_WRONLY: ouverture en écriture seule (création ou ajout) O_RDWR: ouverture en lecture et écriture (mise à jour n’importe où) O TRUNC: libération du contenu du fichier, s’il existe + curseur _ ,placé en début de fichierO_APPEND: contenu du fichier non touché + curseur placé en EOFO_SYNC: attend la fin d’écriture sur le média après chaque write (pas de cache)O_NONBLOCK: E/S non bloquantes.
Version Septembre 2011 N°61
Ouverture/Création: open (oflags)
Règles et choix incohérents
O_CREAT si la création est permise ⇒ ¬ O_RDONLY
O_EXCL si le fichier ne doit pas déjà exister ⇒ O_WRONLY +
Choisir l’un des 3 types exclusifs d’action : O_RDONLY, O_WRONLY, O_RDWR
+
O_CREAT
O_TRUNC ou O_APPEND pour placer le curseur au début (resp. à la
fin) du fichier (doit donc déjà exister ⇒ ¬ O_EXCL)
O_SYNC si les écritures doivent être immédiates ⇒ ¬ O_RDONLY.
23
Version Septembre 2011 N°62
Ouverture/Création: open (oflags)
open (nomFichier, O_RDONLY)
Curseur au début du pour lire
Exemples
open (nomFichier, O_WRONLY | O_CREAT | O_TRUNC, …)
[Création + effacement] si nécessaire + curseur au début pour écrire
open (nomFichier, O_WRONLY | O_APPEND, …)
Curseur en fin pour écrire
open (nomFichier, O_WRONLY | O_CREAT | O_APPEND, …)Création si nécessaire + curseur en fin pour écrire
open (nomFichier, O_WRONLY | O_CREAT | O_EXCL, …)
Création si n’existe pas (erreur sinon) + curseur au début pour écrire
open (nomFichier, O_RDWR)
Doit exister + curseur au début pour lire ou écrire n’importe où
Version Septembre 2011 N°63
Ouverture/Création: open (perm)Règle
Les permissions associées à un fichier lors de sa créationsont fixées par la conjonction de deux points de vue :
Point de vue :du programmeur, qui propose des permissions logiques
de l’utilisateur, propriétaire des fichiers créés, qui
sont fixées par la conjonction de deux points de vue :
Ex: Compilateur: exécution / Editeur: lecture et écriture…
peut interdire certaines permissions
umask : pas de lecture/écriture pour les autres
Permission appliquée = perm & ~umask
Masque interdictions
24
Version Septembre 2011 N°64
Ouverture/Création: open (perm)Valeurs possibles
Pour donner des droits
Le propriétaire
Le Groupe propriétairee G oupe p op éta e
Les autres
Version Septembre 2011 N°65
open (« f », O_WRONLY | O_CREAT, )
Ouverture/Création: open (perm)Exemple
1 1 01 0 0 0 0 0)
0 0 00 1 0 0 1 0022Group = ¬write
umask
1 1 01 0 0 0 0 00 0 10 1 1 0 0 0
|
0 0 00 0 0 1 1 1 |
1 1 11 1 1 1 1 1
1 1 11 0 1 1 0 1&
~
1 1 11 0 1 1 0 1755
pOther = ¬write =
25
Version Septembre 2011 N°66
Création d'un fichier
Equivalencesopen (path, O WRONLY | O CREAT)open (path, O_WRONLY | O_CREAT)creat (path, mode)mknod : Fichier spéciaux (FIFO, ...)
Deux Phases: création et ouverture Voir Communication inter-processus
Paramètres oflag = 010000 | 001000 (O_RDONLY,...)
Commande(s) associée(s): emacs, gcc, cp, ...Structure(s) interne(s): tables, super-bloc
Version Septembre 2011 N°67
Création d'un fichier: mécanisme interneEtapes
Localisation inode parent (I.P),Localisation inode parent (I.P),Recherche nom fichier...
Si le nom n’existe pas alors:Verrouillage I.P., liste des inodes libresAllocation inode: inode-mémoire = get (inode-disque) Modification I.P.: Informations fichier
Sinon (le nom existe) :Désallocation blocs: contenu fichierNon-Modification I.P.
Importance des verrous et du mode noyau
26
Version Septembre 2011 N°68
Processus 1#include <sys/types.h>
Ouverture/Création d'un fichier (1)
y yp#include <sys/stat.h>#include <fcntl.h>int main () { int rfd, wfd, rwfd;
if ((rfd = open("/etc/bashrc",O_RDONLY)) < 0)erreur;
Attention !
erreur;if ((rwfd = open("/etc/bashrc", O_RDWR)) < 0)
erreur; if ((wfd = open("/.bashrc",O_WRONLY | O_CREAT)) < 0)
erreur; }
Action: ouverture: rfd, rwfd - création/ouverture: wfd
Version Septembre 2011 N°69
Ouverture/Création d'un fichier (2)
Processus 2#include <sys/fcntl.h>#include <sys/stat h>#include <sys/stat.h> #include <sys/types.h> int main () {
int rfd, wfd;if ((wfd = open("/etc/bashrc",O_WRONLY)) < 0)
erreur;if ((rfd = open("/.bash_profile",O_RDONLY)) < 0)
erreur;}Deux processus indépendantsDes tables partagées et privées
Action: ouverture: rfd - ouverture: wfd
27
Version Septembre 2011 N°70
Ouverture d'un fichier: Vision interne
P1 01
Position :État :Nombre :
O_RDONLY
1/etc/bashrc
N° inode :Nb. copies :I d I f
123
Attention : partage possible dup/forkP2 0
Proc
essu
s 12345
…
…
Position :État :Nombre :
O_RDWR
1…
Position :État :Nombre :
O_WRONLY
1
Inode Infos …
N° inode :Nb. copies :Inode Infos …
1/.bashrc
…
Table fichiersEspace utilisateur Table inodes
Proc
essu
s P2 0
12345
…
1
Position :État :Nombre : 1
O_RDONLY
Position :État :Nombre :
O_WRONLY
1
N° inode :Nb. copies :Inode Infos …
/.bash_profile
1
…
Version Septembre 2011 N°71
Fermeture d’un fichier: close
Descripteur de fichier
Mise à jour des tables internes (processus + noyau)
fichier
fd est une entrée dans la TDF :open, fork, voie standard…
Fermeture par le noyau des fichiers à la terminaison d’un processus (exit(?))
28
Version Septembre 2011 N°72
Fermeture d'un fichier
Processus 2#include <unistd.h> int main ()int main () {
int rfd, wfd;/* Ouverture et utilisation */ ... close (rfd); /* exit: fermeture implicite */ close (wfd); /* exit: fermeture implicite */ }
T bl fi hi /i dTables fichiers/inodesDécrémentations compteursDésallocations élémentsLibération complète si le compteur atteint 0
Commande(s) associée(s): exit, éditeur…Structure(s) interne(s): tables, buffers
Version Septembre 2011 N°73
Fermeture d'un fichier: Vision interne
P1 01
Position :État :Nombre :
O_RDONLY
1/etc/bashrc
N° inode :Nb. copies :I d I f
123
P2 0
Proc
essu
s 12345
…
…
Position :État :Nombre :
O_RDWR
1…
Position :État :Nombre :
O_WRONLY
1
Inode Infos …
N° inode :Nb. copies :Inode Infos …
1/.bashrc
…
Table fichiersEspace utilisateur Table inodes
Proc
essu
s P2 0
12345
…
1
Position :État :Nombre : 1
O_RDONLYN° inode :Nb. copies :Inode Infos …
/.bash_profile
1
…Position :État :Nombre :
O_WRONLY
1nullnull
29
Version Septembre 2011 N°74
Lecture d’un fichier: read
Descripteur fichier
Nombre octets lus
Mise à jour des tables internes (noyau)fd é d l TDF l
Lieu de stockage données lues
Nombre octets à lire
fd est une entrée dans la TDF ouverte en lecture :open, fork, voie standard…
Allocation de buffer impérativeNb octets lus ≤ Nb octets à lire (EOF, périphérique,…)Début = position du curseur Après = position + nb oct.lus
Version Septembre 2011 N°75
Lecture d'un fichier
Processus 1#include <sys/types.h> #include <unistd h>#include <unistd.h> int main () {
int rfd, nb; char tabp[30]; char tabg[1024];/* Ouverture rfd */ ... nb = read (rfd, tabp, 30); nb = read (rfd, tabg, 1024);nb = read (rfd tabp 20);nb = read (rfd, tabp, 20);
}Lecture à travers une même entrée
Commande(s) associée(s): cat, more, emacs, ...Structure(s) interne(s): tables, blocs, buffers
30
Version Septembre 2011 N°76
Lecture d'un fichier: Commentaires
Verrouillage/partageDurée d'un readDurée d un readVerrouillage explicite possible
Schéma lecteur/écrivain possiblePlusieurs descripteurs possibles
Lecture réelleAttention: Lecture bloc par blocBloc dans le "buffer cache" ou sur le disque?Lecture anticipée
Version Septembre 2011 N°77
Lecture d'un fichier
Processus 1#include <sys/types.h> #include <unistd h> #include <unistd.h> int main () {
int rfd1, rfd2, nb;char tab1[30], tab2[30];/* Ouverture rfd1, rfd2 */ ... nb = read (rfd1, tab1, 30); nb read (rfd2 tab2 30);nb = read (rfd2, tab2, 30);
}Lecture à travers plusieurs entrées – attention
Ici: 2 descripteurs indépendancefork: "2" descripteurs dépendance
31
Version Septembre 2011 N°78
Lecture d’un fichier (2)
Version Septembre 2011 N°79
Ecriture dans un fichier: write
Descripteur fichier
Nombre octets écrits
Mise à jour des tables internes (noyau)fd est une entrée dans la TDF ouverte en écriture :
Données à écrire
Nombre octets à écrire
fd est une entrée dans la TDF ouverte en écriture :open, fork, voie standard…
Nb octets écrits ≤ Nb octets à écrire EOF, périphérique (imprimante, réseau…), signal, média/quota plein
Début = position du curseur Après = position + nb octets écrits
32
Version Septembre 2011 N°80
Ecriture dans un fichier
Processus 1#include <sys/types.h> #include <unistd h> #include <unistd.h> int main () {
int wfd, nb;char tab[30];/* Ouverture wfd */ /* Remplissage de tab */ ... nb = write (wfd tab 30); nb = write (wfd, tab, 30); /* Remplissage à partir de tab */ ... nb = write (wfd, tab, 30);
}Commande(s) associée(s): cat, emacs, …Structure(s) interne(s): Tables, blocs, buffer
Version Septembre 2011 N°81
Ecriture dans un fichier (2)
33
Version Septembre 2011 N°82
Ecriture d'un fichier: commentaires
Verrouillage/partageDurée d'un writeDurée d un writeVerrouillage explicite possible
Schéma lecteur/écrivain possiblePlusieurs descripteurs possibles
Ecriture réelleAllocation de blocs par nécessité (indirect, données)Ecriture partielle Lecture du blocEcriture différée des blocs: "buffer cache"
Version Septembre 2011 N°83
Positionnement dans un fichier: lseek
Descripteur fichier
position
Mise à jour des tables internes (noyau)fd est une entrée dans la TDF ouverte en écriture :
Référentiel
déplacementEntier 64 bits
fd est une entrée dans la TDF ouverte en écriture :open, fork, voie standard…
Retour = position par rapport au début du fichierRéférentiel = SEEK_SET, SEEK_CUR, SEEK_END déplacement positif/négatif avant (resp. après) le début (resp. fin)
34
Version Septembre 2011 N°84
Positionnement : commentaires
Référentiel :SEEK SET : par rapport au débutSEEK_SET : par rapport au débutSEEK_CUR: par rapport au curseurSEEK_END :par rapport à la fin
Comment connaitre la position courante?
O i i è l fiOn peut se positionner après la finToute écriture crée des trousLa lecture de trous rend des octets nuls
Une position négative est souvent une erreur
Version Septembre 2011 N°85
Positionnement dans un fichier
#include <sys/types.h>#include <unistd.h>int main () { int main () {
int fd, pos;char tab[30];/* Ouverture fd */ ... pos = lseek (fd, 1000, SEEK_CUR); // voir aussi SEEK_SETpos = lseek (fd, -50, SEEK_END);
}read/write ⇒ accès séquentiellseek ⇒ accès directPas d'accès disque
Commande(s) associée(s): éditeur…Structure(s) interne(s): tables des fichiers
35
Version Septembre 2011 N°86
Duplication d’entrée: dup2
Descripteur fichier à dupliquer
Mise à jour des tables internes (processus et noyau)fd1 é d l TDF
à dupliquer
Descripteur fichier où copier
fd1 est une entrée dans la TDFfd2 est une entrée libre (ou qui sera fermée)le contenu de fd1 est recopié dans fd2 + MAJ de compteurs de référencesdup réalise la copie dans la première entrée libre
Version Septembre 2011 N°87
Duplication d’entrée: dup
Descripteur fichier à dupliquerà dupliquer
Démarche1. Sauvegarde de fd2 (dup)2. Recopie de fd1 dans fd23. Restauration (dup2 + close)
Idem à dup2La copie se fait dans la 1ère entrée libre flle contenu de fd1 est recopié dans fl + MAJ de compteurs de référencesIl est nécessaire de connaître l’état de la TDF
( p )
36
Version Septembre 2011 N°88
dup: mécanismes de base (1)P1 0
1
Position :État :Nombre :
O_RDONLY
1/etc/bashrc
N° inode :Nb. copies :I d I f
2Pr
oces
sus 1
2345
…
…
Position :État :Nombre :
O_RDWR
1
Inode Infos …
2
Table fichiersEspace utilisateur Table inodes
Version Septembre 2011 N°89
dup: mécanismes de base (2)
Fonctionnement généralD li i d d i d fi hiDuplication du descripteur de fichierTable des fichiers (ouverture): incrémentation des référencesTable des fichiers (fermeture): décrémentation des référencesTable des inodes: pas de modificationD è ê b ffDeux accès au même buffer
Utilisationdup et dup2 (routine)Implémentation du shell: redirections E/S
Liens avec les structures internes: voir open
37
Version Septembre 2011 N°90
dup: exemple simple
#include <sys/types.h>#include <unistd.h>#i l d f tl h#include <fcntl.h>int main () {
int fd, nfd;char tab1[512], tab2[512];fd = open ("/etc/bashrc", O_RDONLY); /* ex: fd = 3 */ ... fd d (fd) /* fd 6 */nfd = dup (fd); /* ex: nfd = 6 */
read (fd, tab1, 512);read (nfd, tab2, 512);close (fd);read (nfd, tab2, 512);...
}
Version Septembre 2011 N°91
dup2: exemple simple
#include <sys/types.h>#include <unistd.h>#include <fcntl h>#include <fcntl.h>int main () {
int fd, nfd;char tab1[512], tab2[512];fd = open ("/etc/bashrc", O_RDONLY);/* ex: fd = 3 */
nfd = dup2 (fd, 4); /* nfd = 4 *//* si non libre: "4" est fermé avant *//* si non libre: 4 est fermé avant */
read (fd, tab1, 512);read (nfd, tab2, 512);close (fd);read (nfd, tab2, 512);...
}
38
Version Septembre 2011 N°92
dup: exemple de la redirection en shell
#include <sys/types.h>#include <unistd.h>#i l d f tl h#include <fcntl.h>int main () {
int pid, fd, nfd; ... if ( (pid = fork ()) < 0) erreur;if (pid == 0) { /* Traitement fils */
if (/* redirection */) {fd open (fichier ) /* création */fd = open (fichier, ...); /* création ... */close (stdout); nfd = dup (fd); /* nfd = stdout */close (fd); exec de la commande}
... } ... }
Version Septembre 2011 N°93
A propos de fcntl
Descripteur fichier
C d fd
Commande :f l (fd1 F DUPFD 0) d (fd1) i 0 lib
Commande sur fd
Arguments de la commande
fcntl (fd1, F_DUPFD, 0) ⇔ dup (fd1) si 0 est libreF_GETFL : attributs positionnés lors de openF_SETFL : nouveaux attributs - dans arg. Seuls O_APPEND, O_NONBLOCK et O_ASYNC… Gestion de verrous, Signaux (interruptions IO), PID processus concerné... relatifs au fichier
39
Version Septembre 2011 N°94
A propos de ioctl
Descripteur fichier
C d fd
Commande :
Commande sur fd
Arguments de la commande
Commande :Opérations sur un périphériquePas une commande POSIXGrand nombre de commande qui dépendent du matériel…
Version Septembre 2011 N°95
Opérations atomiques ou pas ?
Attention :Programmation mono ou multi processusOn peut être interrompu entre deux instructions