pour-poly.ppt [Mode de compatibilité] -...
Transcript of pour-poly.ppt [Mode de compatibilité] -...
11
Programmation système &
3ème année Licence MIAGE
Réseaux
Philippe LahireUniversité de Nice Sophia-Antipolis
Septembre 2013
Ce cours fait de nombreux emprunts à celui de R. RousseauCe cours fait de nombreux emprunts à celui de R. Rousseau
Version septembre 2013 N°4
Organisation des enseignements
cours Semaine/date TP
1 Introduction + Entrées-Sorties 37/12.09
PrévisionPrévision
2 Introduction + Entrées-Sorties 37/12.09
3 Systèmes de Fichiers 38/19.09 TP N°1 : E/S (1h30)
4 Systèmes de Fichiers (prog) 39/26.09 TP N°1 : E/S (1h30)
5 Systèmes de Fichiers (prog) 40/03.10 TP N°2 : Syst. Fich. (1h30)
6 Processus 41/10.10 TP N°2 : Syst. Fich. (1h30)
7 Processus (prog) 42/17.10 TP N°2 : Syst. Fich. (1h30)
8 Tubes 45/07.11 TP N°3 : Processus Fork (1h30)
9 Tubes 47/21.11 TP N°4 : Processus Fork (1h30)
10 Signaux 48/28.11 TP N°4 : Processus exec (1h30)
11 Signaux 49/05.12 TP N°5 : Tubes (1h30)
12 Révision/Rattrapage 51/19.12 TP N°6 : Signaux(1h30)
2/09.01 TP N°6 : Signaux(1h30)
2/09.01 TP Révision/ Rattrapage
Contrôle Terminal ??
22
Version septembre 2013 N°6
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)”,CC 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
Conc
epts
ixix 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
Uni
Win
dow
sW
indo
ws
Version septembre 2013 N°10
Historique des systèmes UNIX (wikipedia)
33
Version septembre 2013 N°11
Historique des systèmes Windows (wikipedia)
Version septembre 2013 N°12
Vers une normalisation: POSIX
PPortable OOpen SSystem IInterface eXXchange
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écurité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)Posix 1, 1b, 1c: 1998, 1993, 1995
44
Version septembre 2013 N°13
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 2013 N°15
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
55
Version septembre 2013 N°18
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
Version septembre 2013 N°20
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)
66
Version septembre 2013 N°22
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
Version septembre 2013 N°23
Différents shells unix possibles
Bourne shellBourne shell (historiquement, le 1er)
Toujours utilisé par les scripts internes du systèmeToujours utilisé par les scripts internes du système
CC--shellshell (csh, tcsh)
syntaxe différente
Évolutions du Bourne shellÉ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
77
Version septembre 2013 N°24
Quelques éléments d’administration
/etc/passwd/etc/passwdnom_du_compte : mot_de_passe : numero_utilisateur : numero_de_groupe : nom_du_compte : mot_de_passe : numero_utilisateur : numero_de_groupe :
commentaire : répertoire : programme de demarragecommentaire : 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_demarragecommentaire : répertoire : programme_de_demarrage
/etc/group/etc/groupnom_de_groupe : champ_special : numero_de_groupe : membre1, membre2nom_de_groupe : champ_special : numero_de_groupe : membre1, membre2
root:x:0:rootbin:x:1:root,bin,daemondaemon:x:2:users:x:100:
Version septembre 2013 N°29
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 CPas 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
88
Version septembre 2013 N°35
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
Version septembre 2013 N°36
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 »
99
Version septembre 2013 N°37
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...
Version septembre 2013 N°39
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
1010
Version septembre 2013 N°40
Exception vs compte-renduPresque toutes fonctions/appels systèmes
Traitement standard des erreurs (1)
entierpointeur…Presque toutes fonctions/appels systèmes
Utilisation de errnoerrno :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)intro(2) : liste des différents codes
Méthodologie : test compte-rendu + errnoerrno
Version septembre 2013 N°41
Fonctions associées#include <string.h>
Traitement standard des erreurs (2)
#include string.hchar* strerror (int errnum)retourne message « en clair » associé à errnumerrnum
#include <stdio.h>void perror (const char* message)affiche message message associé à errno errno (stderrstderr)affiche « message » + message associé à errno errno (stderrstderr)
Méthodologie :utiliser en s’appuyant sur « man » (Errors / Erreurs)ou traitement ad hoc (ex: gestion paramètres de « main »)
1111
Version septembre 2013 N°42
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(exit(11))
ici > 1
exit(exit(11))}
if ( (fichier = fopen(argv[1], « rw »)) == NULL) {fprintf(stderr,«Erreur %i:%s \n », errno, strerror(errno));exit(exit(22); }); }
} }
Version septembre 2013 N°43
Traitement des erreurs de W. Stevens (1)
+ returnreturn
format message d’erreur avec nb %% + nb arguments
+ exit(1)exit(1)
+ abortabort
Affiche aussi le message associé à errnoerrno
Macros : en majuscule et sans paramètrePas de message passé en paramètre mais :Affichage: Nom du fichier + numéro de ligne
1212
Version septembre 2013 N°44
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_EXITERR_EXIT;
Pas par défaut dans linux
;…if (fclose(fichier)) != 0)
ERR_RETURNERR_RETURN;} }
Version septembre 2013 N°47
Mise au point / Survol
bash gcc emacs
int open (….) { } int read (….) { }
TablesTables :
FILE* fopen (….) { } Bien sur on se sert aussi du « shell »pour lancer un
programme
…
Système exploitation
TablesTables :•Fich. Ouvert•Volumes•Blocs•….
Consulte / met à jour« appelle » / exécute
processus
1313
Version septembre 2013 N°48
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,…)
Version septembre 2013 N°49
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),
1414
Version septembre 2013 N°50
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)
Version septembre 2013 N°51
Principes généraux (4)
Une suite d’octetsDisqueDisque
Curseur
TamponDescripteur de fichier :
Prédéfini (fich Stand )
MémoireMémoire Programme
F.D.F.D.
• Prédéfini (fich. Stand.)• A associer (open)
Simple numéroSimple numéro
1515
Version septembre 2013 N°52
Principes généraux (5)
Association (open…)Dans le programmeDans le programme Appel du programmeAppel du programme
( p )nom externe / Desc. Fichier
chemin relatifchemin absolu
Pas de caractère génériquePas 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 On n’utilise jamais directement directement
Le clavier ou l’écranLe clavier ou l’écran
Version septembre 2013 N°53
Un modèle d’E/S adaptable aux langages
Impact:• Performance
Un modèle d’entrée sortie de bas niveauxLangage CJava…
• Utilisation…
1616
Version septembre 2013 N°54
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 ?
Version septembre 2013 N°55
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)
1717
Version septembre 2013 N°56
Tables pour gérer les fichiers P
1 01
Position :État : N° inode :
Tables partagéesTables partagéesPrivéPrivé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 :
Version septembre 2013 N°57
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
1818
Version septembre 2013 N°58
Ouverture/Création d’un fichier: openopen
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
Version septembre 2013 N°59
Ouverture/Création: openopen (oflags)
O_CREAT:O_CREAT: création, si le fichier n’existe pasO EXCL:O EXCL: combiné avec O CREATO CREAT, création si le fichier n’existe
Valeurs possibles
__ __ ,pas, erreur sinonO_RDONLY:O_RDONLY: ouverture en lecture seule. O_WRONLY:O_WRONLY: ouverture en écriture seule (création ou ajout) O_RDWR:O_RDWR: ouverture en lecture et écriture (mise à jour n’importe où) O TRUNC:O TRUNC: libération du contenu du fichier, s’il existe + curseur __ ,placé en début de fichierO_APPEND:O_APPEND: contenu du fichier non touché + curseur placé en EOFO_SYNC:O_SYNC: attend la fin d’écriture sur le média après chaque write (pas de cache)O_NONBLOCK:O_NONBLOCK: E/S non bloquantes.
1919
Version septembre 2013 N°60
Ouverture/Création: openopen (oflags)
Règles et choix incohérents
O_CREATO_CREAT si la création est permise ⇒ ¬ O_RDONLYO_RDONLY
O_EXCLO_EXCL si le fichier ne doit pas déjà exister ⇒ O_WRONLYO_WRONLY +
Choisir l’un des 3 types exclusifs d’action : O_RDONLYO_RDONLY, O_WRONLYO_WRONLY, O_RDWRO_RDWR
+
O_CREATO_CREAT
O_TRUNCO_TRUNC ou O_APPENDO_APPEND pour placer le curseur au début (resp. à la
fin) du fichier (doit donc déjà exister ⇒ ¬ O_EXCLO_EXCL)
O_SYNCO_SYNC si les écritures doivent être immédiates ⇒ ¬ O_RDONLYO_RDONLY.
Version septembre 2013 N°61
Ouverture/Création: openopen (oflags)
open (nomFichier, O_RDONLY)open (nomFichier, O_RDONLY)
Curseur au début du pour lire
Exemples
open (nomFichier, O_WRONLY | O_CREATopen (nomFichier, O_WRONLY | O_CREAT | O_TRUNCO_TRUNC, …)
[Création + effacement] si nécessaire + curseur au début pour écrire
open (nomFichier, O_WRONLY | O_APPENDopen (nomFichier, O_WRONLY | O_APPEND, …)
Curseur en fin pour écrire
open (nomFichier, O_WRONLY | O_CREATopen (nomFichier, O_WRONLY | O_CREAT | O_APPENDO_APPEND, …)Création si nécessaire + curseur en fin pour écrire
open (nomFichier, O_WRONLY | O_CREATopen (nomFichier, O_WRONLY | O_CREAT | O_EXCLO_EXCL, …)
Création si n’existe pas (erreur sinon) + curseur au début pour écrire
open (nomFichier, O_RDWRopen (nomFichier, O_RDWR)
Doit exister + curseur au début pour lire ou écrire n’importe où
2020
Version septembre 2013 N°62
Ouverture/Création: openopen (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
umaskumask : pas de lecture/écriture pour les autres
Permission appliquée = perm & ~umaskumask
Masque interdictions
Version septembre 2013 N°63
Ouverture/Création: openopen (perm)Valeurs possibles
Pour donner des droits
Le propriétaire
Le Groupe propriétairee G oupe p op éta e
Les autres
2121
Version septembre 2013 N°64
open (« f », O_WRONLYO_WRONLY | O_CREAT, O_CREAT, ))
Ouverture/Création: openopen (perm)Exemple
1 1 01 0 0 0 0 0))
0 0 00 1 0 0 1 0022Group = ¬¬write
umaskumask
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 =
Version septembre 2013 N°65
Création d'un fichier
Equivalencesopenopen (path, O WRONLY | O CREAT)openopen (path, O_WRONLY | O_CREAT)creatcreat (path, mode)mknodmknod : 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
2222
Version septembre 2013 N°66
Création d'un fichier: mécanisme interneEtapes
Localisation inode parent (I.PI.P),Localisation inode parent (I.PI.P),Recherche nom fichier...
Si le nom n’existe pas alors:Verrouillage I.P.I.P., liste des inodes libresAllocation inode: inode-mémoire = get (inode-disque) Modification I.P.I.P.: Informations fichier
Sinon (le nom existe) :Désallocation blocs: contenu fichierNon-Modification I.P.I.P.
Importance des verrous et du mode noyauImportance des verrous et du mode noyau
Version septembre 2013 N°67
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 = openopen("/etc/bashrc",O_RDONLY)) < 0)erreur;
Attention !
erreur;if ((rwfd = openopen("/etc/bashrc", O_RDWR)) < 0)
erreur; if ((wfd = openopen("/.bashrc",O_WRONLY | O_CREAT)) < 0)
erreur; }
Action: ouverture: rfd, rwfd - création/ouverture: wfd
2323
Version septembre 2013 N°68
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 = openopen("/etc/bashrc",O_WRONLY)) < 0)
erreur;if ((rfd = openopen("/.bash_profile",O_RDONLY)) < 0)
erreur;}Deux processus indépendantsDes tables partagées et privées
Action: ouverture: rfd - ouverture: wfd
Version septembre 2013 N°69
Ouverture d'un fichier: Vision interne
P1 01
Position :État :Nombre :
O_RDONLYO_RDONLY
11/etc/bashrc/etc/bashrc
N° inode :Nb. copies :I d I f
112233
Attention : partage possible dup/fork
P2 0
Proc
essu
s 12345
…
…
Position :État :Nombre :
O_RDWRO_RDWR
11…
Position :État :Nombre :
O_WRONLYO_WRONLY
11
Inode Infos …
N° inode :Nb. copies :Inode Infos …
11/.bashrc/.bashrc
…
Table fichiersEspace utilisateur Table inodes
Proc
essu
s P2 0
12345
…
11
Position :État :Nombre : 11
O_RDONLYO_RDONLY
Position :État :Nombre :
O_WRONLYO_WRONLY
11
N° inode :Nb. copies :Inode Infos …
/.bash_profile/.bash_profile
11
…
2424
Version septembre 2013 N°70
Fermeture d’un fichier: closeclose
Descripteur de fichier
Mise à jour des tables internes (processus + noyau)
fichier
fd est une entrée dans la TDF :openopen, forkfork, voie standard…
Fermeture par le noyau des fichiers à la terminaison d’un processus (exitexit(?))
Version septembre 2013 N°71
Fermeture d'un fichier
Processus 2#include <unistd.h> int main ()int main () {
int rfd, wfd;/* Ouverture et utilisation */ ... closeclose (rfd); /* exit: fermeture implicite */ closeclose (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
2525
Version septembre 2013 N°72
Fermeture d'un fichier: Vision interne
P1 01
Position :État :Nombre :
O_RDONLYO_RDONLY
11/etc/bashrc/etc/bashrc
N° inode :Nb. copies :I d I f
112233
P2 0
Proc
essu
s 12345
…
…
Position :État :Nombre :
O_RDWRO_RDWR
11…
Position :État :Nombre :
O_WRONLYO_WRONLY
11
Inode Infos …
N° inode :Nb. copies :Inode Infos …
11/.bashrc/.bashrc
…
Table fichiersEspace utilisateur Table inodes
Proc
essu
s P2 0
12345
…
11
Position :État :Nombre : 11
O_RDONLYO_RDONLYN° inode :Nb. copies :Inode Infos …
/.bash_profile/.bash_profile
11
…Position :État :Nombre :
O_WRONLYO_WRONLY
11nullnull
Version septembre 2013 N°73
Lecture d’un fichier: readread
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 :openopen, forkfork, voie standard…
Allocation de bufferbuffer impérativeNb octets lus ≤ Nb octets à lire (EOF, périphérique,…)Début = position du curseur Après = position + nb oct.lus
2626
Version septembre 2013 N°74
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 = readread (rfd, tabp, 30); nb = readread (rfd, tabg, 1024);nb = readread (rfd tabp 20);nb = readread (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
Version septembre 2013 N°75
Lecture d'un fichier: Commentaires
Verrouillage/partageDurée d'un readreadDurée d un readreadVerrouillage 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
2727
Version septembre 2013 N°76
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 = readread (rfd1, tab1, 30); nb readread (rfd2 tab2 30);nb = readread (rfd2, tab2, 30);
}Lecture à travers plusieurs entrées – attention
Ici: 2 descripteurs indépendanceforkfork: "2" descripteurs dépendance
Version septembre 2013 N°77
Lecture d’un fichier (2)
2828
Version septembre 2013 N°78
Ecriture dans un fichier: writewrite
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 :openopen, forkfork, 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
Version septembre 2013 N°79
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 = writewrite (wfd tab 30); nb = writewrite (wfd, tab, 30); /* Remplissage à partir de tab */ ... nb = writewrite (wfd, tab, 30);
}Commande(s) associée(s): cat, emacs, …Structure(s) interne(s): Tables, blocs, buffer
2929
Version septembre 2013 N°80
Ecriture dans un fichier (2)
Version septembre 2013 N°81
Ecriture d'un fichier: commentaires
Verrouillage/partageDurée d'un writewriteDurée d un writewriteVerrouillage 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"
3030
Version septembre 2013 N°82
Positionnement dans un fichier: lseeklseek
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 :openopen, forkfork, 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)
Version septembre 2013 N°83
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
3131
Version septembre 2013 N°84
Positionnement dans un fichier
#include <sys/types.h>#include <unistd.h>int main () { int main () {
int fd, pos;char tab[30];/* Ouverture fd */ ... pos = lseeklseek (fd, 1000, SEEK_CUR); // voir aussi SEEK_SETpos = lseeklseek (fd, -50, SEEK_END);
}readread/writewrite ⇒ accès séquentiellseeklseek ⇒ accès directPas d'accès disque
Commande(s) associée(s): éditeur…Structure(s) interne(s): tables des fichiers
Version septembre 2013 N°85
Duplication d’entrée: dup2dup2
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érencesdupdup réalise la copie dans la première entrée libre
3232
Version septembre 2013 N°86
Duplication d’entrée: dupdup
Descripteur fichier à dupliquerà dupliquer
Démarche1. Sauvegarde de fd2 (dup)2. Recopie de fd1 dans fd23. Restauration (dup2 + close)
Idem à dup2dup2La 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 TDFIl est nécessaire de connaître l’état de la TDF
( p )
Version septembre 2013 N°87
dup: mécanismes de base (1)
P1 01
Position :État :Nombre :
O_RDONLYO_RDONLY
11/etc/bashrc/etc/bashrc
N° inode :Nb. copies :I d I f
22
Proc
essu
s 12345
…
…
Position :État :Nombre :
O_RDWRO_RDWR
11
Inode Infos …
22
Table fichiersEspace utilisateur Table inodes
3333
Version septembre 2013 N°88
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
Utilisationdupdup et dup2dup2 (routine)Implémentation du shell: redirections E/S
Liens avec les structures internes: voir open
Version septembre 2013 N°89
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 = openopen ("/etc/bashrc", O_RDONLY); /* ex: fd = 3 */ ... fd dd (fd) /* fd 6 */nfd = dupdup (fd); /* ex: nfd = 6 */
readread (fd, tab1, 512);readread (nfd, tab2, 512);closeclose (fd);readread (nfd, tab2, 512);...
}
3434
Version septembre 2013 N°90
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 = openopen ("/etc/bashrc", O_RDONLY);/* ex: fd = 3 */
nfd = dup2dup2 (fd, 4); /* nfd = 4 *//* si non libre: "4" est fermé avant *// si non libre: 4 est fermé avant /
readread (fd, tab1, 512);readread (nfd, tab2, 512);closeclose (fd);readread (nfd, tab2, 512);...
}
Version septembre 2013 N°91
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 = forkfork ()) < 0) erreur;if (pid == 0) { /* Traitement fils */
if (/* redirection */) {fd openopen (fichier ) /* création */fd = openopen (fichier, ...); /* création ... */closeclose (stdout); nfd = dupdup (fd); /* nfd = stdout */closeclose (fd); exec de la commande}
... } ... }
3535
Version septembre 2013 N°92
A propos de fcntlfcntl
Descripteur fichier
C d fd
Commande :f lf l (fd1 F DUPFD 0) dd (fd1) i 0 lib
Commande sur fd
Arguments de la commande
fcntlfcntl (fd1, F_DUPFD, 0) ⇔ dupdup (fd1) si 0 est libreF_GETFL : attributs positionnés lors de openopenF_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
Version septembre 2013 N°93
A propos de ioctlioctl
Descripteur fichier
C d fd
Commande :
Commande sur fd
Arguments de la commande
Commande :Opérations sur un périphériqueOpérations sur un périphériquePas une commande POSIXGrand nombre de commande qui dépendent du matériel…Grand nombre de commande qui dépendent du matériel…
3636
Version septembre 2013 N°94
Opérations atomiques ou pas ?
Attention :Programmation mono ou multi processusProgrammation mono ou multi processusOn peut être interrompu entre deux instructions
Version septembre 2013 N°97
Structures d’un système de fichiers
P1 0
1Position :État : N° inode :
Tables partagéesTables partagéesPrivéPrivé
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 :
3737
Version septembre 2013 N°98
Les périphériques
Quelques informations pour commencer
Périphériques = fichiers spéciauxFichiers b et c
Périphériques “caractères”terminal, réseaux
Périphériques “blocs”Disques, bandes, Cd-rom
Interface commune: appels systèmes
Version septembre 2013 N°100
Propriétés d’un système de fichiers
Technologie différentes (disques, CD-ROM, CLE USB…)Montage local ou distant (NFS)
Propriétés globales spécifiquesProtections, exportation…
Montage/démontage dynamiquemount, umount (commande ou appel système)
Une hiérarchie de nomsFichiers norma répertoires spécia liens t besFichiers normaux, répertoires, spéciaux, liens, tubes…
Partitionnement des sous-hiérarchiesAllocation du média associé (blocs libre…)Deux niveaux d’organisation:
Logique (suite de blocs, unité d’allocation 1k?)Physique (secteurs, pistes, cylindres)
3838
Version septembre 2013 N°101
Arborescenceet volumes
/dev/rz0g
/dev/rz0a
sharedusr
/
Root filesystem
+ partition de swap/dev/rz2a
/dev/rz0gySwap…
+ partition de swap
/dev/rz1aoracle
etud
/dev/rz2g
Syst. Fic. virtuel
Version septembre 2013 N°102
Création/utilisation Système de fichiers
Création
EXT2Fiable, matureCréation
mkfsmkfs (Syst. Fichiers)Taille des blocksNombre d’inodes…
Utilisationmountmount/umountumount
,Support pour fsckfsckPré allocationLiens symboliques rapides
Redémarrage après crash lentEXT3
Compatible avec EXT2EXT2mountmount/umountumountType Système de fichier
Mêmes structures de données≈ EXT2EXT2 + Journalisation
Ecriture dans un journalEcriture dans le syst. fichiers
3939
Version septembre 2013 N°103
Montage et démontage
Commande mount / umountMontages locaux / distantsMontages locaux / distantsVisualisation: dfexemple: mount -t ext2 -o nodev,nosuid,noexec /dev/sda3 /usr
AutomatisationFichiers: /etc/fstab/etc/init.d/* …
Version septembre 2013 N°105
Le super-bloc
Gestion des blocsNombre blocs libres
Super-bloc … … 1 b
Gr. Blocs 0
…Descr. De gr. n b… 1 bBitm. blocs
« Liste » blocs libresBitmap blocs libre/occ.
Gestion des inodesNombre total inodes Compteur inodes libres« Liste » inodes libres
1 bBitm. blocsBitm. inodes 1 b…
n bTab. inodes …
Blocs Fichiers
Blocs libres
n bTab. blocs
…« Liste » inodes libres Bitmap inode libre/occupé
Gestion globaleTaille système fichiersIndicateur de modificationDuplication dans les groupes
…
Gr. Blocs n
4040
Version septembre 2013 N°106
Maintien de la cohérence FSCK 1/2
Qui ?: L'administrateur
Pourquoi ?: Synchronisation (sync)Blocs: cache buffer disqueInode: Copie en mémoire disqueSuper-bloc: Copie en mémoire disque
Quand ?:Quand ?:Réparation: Crash, Coupure alimentationPrévention: Au reboot
Réparation: Attention aux pertes de données !!
Version septembre 2013 N°107
Maintien de la cohérence FSCK 2/2
Objectifs:Objectifs: Vérifications, réparationsBlocs:
Appartenances à plusieurs inodes Non référencés
Inodes: Tailles fichier/répertoire incohérentesNombres de liens incorrectsMauvais formatsNon référencés
Super-bloc:Plus de blocs que possibleMauvais format de la liste des blocs libresTotal des blocs/inodes libres incohérentsBlocs libres manquants
4141
Version septembre 2013 N°108
Montage/démontage et structures internes
N° inode :Nb. copies :Inode Infos …
SuperBloc :Inode cible :
…mount
t e t2
…
…
N° inode :Nb. copies :Inode Infos ……
N° inode :Nb. copies :
Inode cible :Inode à monter :Syst. Fichier :
SuperBloc :Inode cible :Inode à monter :
…
/dev/sda3
/
-t ext2
mount
Table inodesTable volumes
pInode Infos …
N° inode :Nb. copies :Inode Infos …
…
Syst. Fichier :
… copie mémoire
/dev/sda7
/usr
-t ext2
Version septembre 2013 N°109
Principales arborescences 1/2
Répertoire Description
/bin Binaires
/dev Périphériques
/etc Fichiers de configuration
/lib Bibliothèques de base
/tmp Fichiers temporaires
/mnt Montages nfs
/var Fichiers de log, mail, impression, …/var Fichiers de log, mail, impression, …
/home Répertoires utilisateurs
4242
Version septembre 2013 N°110
Principales arborescences 2/2
Répertoire Description
/usr/X11R6 Noyau X Window
/usr/bin Binaires autres paquetages
/usr/include En-têtes
/usr/lib Bibliothèques autres paquetages
/usr/man Manuels en ligne
/usr/src Source noyau, …
/usr/local Installation locales au site /usr/local Installation locales au site
/usr/share Fichiers paquetages de l'instal.
/usr/sbin Binaires administration
Version septembre 2013 N°111
Filesystem Hierarchy Standard (2004)
BinBin : Essential command binaries
Root filesystem Root filesystem (extrait)(extrait)BinBin : Essential command binariesBootBoot : Static files of the boot loaderdevdev : Device filesetcetc : Host-specific system configurationliblib : Essential shared libraries and kernel modulesmediamedia : Mount point for removeable mediamntmnt : Mount point for mounting a filesystem temporarilyoptopt : Add on application software packagesoptopt : Add-on application software packagessbinsbin : Essential system binariessrvsrv : Data for services provided by this systemtmptmp : Temporary filesusrusr : Secondary hierarchyvarvar : Variable data
Uniformisation des distributionsUniformisation des distributions
4343
Version septembre 2013 N°112
Organisation logique: la réalité
Une forêt de liensUn nom = un lienUn nom un lienLiens:
Entre père et filsEntre frères
Mise en oeuvreCommandes associées: ln et unlinkLiens: dur et symboliquesPar rapport aux inodes:
lien en dur [N:1] un inodelien symbolique [1:1] un inode
Version septembre 2013 N°113
Organisation logique: la réalité
/
usrLien en dur
etud
shared
home
d2
etud1oracle
.profile
Gprofileetud2
Même partition
Un seul fichier
Lien symbolique
≈Raccourcietud2
etud1.profile
Lien en durLien symbolique
Pas de vérification
4444
Version septembre 2013 N°114
Protections: groupes / utilisateurs
Principaux élémentsGrain: le fichierOpérations:
lecture, écriture, exécution/traversée
Objet: utilisateur, groupe, autresNe pas confondre:
Groupe de l'utilisateur et groupe d'un fichierGroupe de l utilisateur et groupe d un fichierFichier /etc/groupCommande newgrp (processus)Commande chgrp (fichier)Liens symbolique / physique
Version septembre 2013 N°115
Protections: de fichier/répertoire
Les fichiersr: permission de lire le fichier u g ow: permission d’écrire le fichier, i.e. ajouter, supprimer ou modifier les données qu’il contientx: permission d’exécuter le fichier
Les répertoiresr: permission de lire, donc de lister le répertoire
mais pas forcément d’en lire les fichiers…w: permission d’écrire dans le répertoire et donc de supprimer l fi hi ’il iles fichiers qu’il contientx: permission de traverser le répertoire. Sans cette permission, toute opération est interdite. Cette interdiction est héritée par tous les fichiers et répertoires qu’il contient
“Un fichier est protégé contre une modification par ses propres permissions, et contre la suppression par les permissions du répertoire qui le contient.“
4545
Version septembre 2013 N°116
Protections:exemple
rwxrwxrwx REP-1
rwxrwxrwx
rwxrwxrwxrwxrwxrwx REP-2 REP-3
FIC-1
PL,PROF PL,PROF
PL,PROF
rwxrwxrwx
rwxr-xr--
FIC-1
rwxrwxrwx
REP-5
REP-4
LIEN-1
rwxr----- PL,PROF
PL,PROF
PL,PROF
PL,PROF
REP-1/REP-2/REP-4/REP-6
REP-1/REP-3/REP-5/LIEN-1
REP-1/REP-2/REP-4/REP-6
LIEN-1 =
rwxrwxrwx
REP-6
FIC-2
r-xr-xr-xPL,PROF
PL,PROF
Utilisateurs: RC, PROF / JPP, ETUD1
Commandes: ls, cd, touch
REP 1/REP 2/REP 4/REP 6
Les droits qui comptent(voir chmod)
Version septembre 2013 N°119
Structure générale d'un fichier
Qualités requises:Evolution de la taille des fichiersEvolution de la taille des fichiersAccès efficaceNombre de fichiers ?Accès multi-processusAccès multi-utilisateurs
Une structure interneUne structure interneDes appels systèmes appropriésDes appels systèmes appropriés
4646
Version septembre 2013 N°120
Structure générale d'une inode 1/2
Copie disqueCopie disque:PropriétairepGroupe propriétaireType fichierDroits d'accèsDates (accès, modification, inode)Nombres de liensAdresses disque (blocs)Taille fichierRéférence ACL au fichier et répertoire
inode = anglais (i-noeud)
Version septembre 2013 N°121
Copie mémoire = Copie disque + …Verrouillé ?
Structure générale d'une inode 2/2
Verrouillé ?Processus en attenteCopie et image disque différentesPériphérique logiqueNuméro inodePointeurs inodes (une par liste)
liste des inodes libresliste des inodes (adressage calculé)
Nombre copies actives
Copie disque du super bloc
4747
Version septembre 2013 N°122
Inode de fichier/répertoire
5007105di i
5007105
é t i
UIDGID
T fi hiordinairerwxr-xr--
19/10/200510/10/200512/10/2005
5
653450 1 … 10
répertoirerwxr-xr--
19/10/200510/10/200512/10/2005
3
3450 1 … 10
Type fichierProtectionsDate lecture
Date modificationDate inode
Nombre liensContenu
Taille
cont
enu aaaaaaaaaaa
bbbbbcccccc
ddddddddddd
cont
enu N° Nom Un format
ls, cd, …
Version septembre 2013 N°123
Arborescence et inodes
…
2010 .8010 ..1003 D1
2010
1003 .201000
3
Infos inode
Infos inode
2010 ..1067 D25790 F1
10
1067 .1003 ..10
67
aaaaaaaaaaacccccccbbbbbbbbbbbbbbbb57
90
Infos inodeInfos inode
4848
Version septembre 2013 N°124
Organisation physique0
1
2
Blocs de donnees
Taille max (blocs) =
.
...
.
3
45
6
7
8
9
simple
10 +256 +
2562 +2563
Taille max (blocs) = 10 + 256 + 2562 + 2563
ls –il
.
....
.
.........
.
...
.
.
....
double
triple
Version septembre 2013 N°125
Organisation physique: Comprendre les choix
Choix d'organisationsBlocs contiguësTable des blocsCompactage, nettoyageTaille de blocsAccès indirectRépertoire / fichier p
ConséquencesFragmentationEfficacité (espace / temps)Limite des fichiers
4949
Version septembre 2013 N°126
Nom attributst_mode
Description Mot = bits de protection
Information sur fichiers: norme POSIX
st_ino st_dev st_nlinkst_uidst_gidst_size
i
pIdentif. Fich.: num. i-node Périphérique du fichier Nombre de liens Ident. utilisateur Ident. groupeTaille en octets D d è l st_atime
st_mtime st_ctime
Date dern. accès lecture Date dern. accès écriture Date dern. modification
Version septembre 2013 N°127
Accès aux fichiers: norme POSIX
Routinefd = creatcreat (nom,mode)
Descriptioncréation nouveau fichier
fd = openopen (fichier,mode) e = closeclose (fd) n = readread (fd,buff,nb) n = writewrite (fd,buff,nb) p = lseeklseek (fd,dep,deb) e = statstat (nom,&buff) fd kdikdi ( d )
ouverture fichier lecture/ecriturefermeture fichier ouvert lecture fichier --> tampon écriture tampon --> fichier déplacement dans fichier récupération info. fichiers
é i é i fd = mkdirmkdir (nom,mode) e = rmdirrmdir (nom) e = linklink (nom1,nom2)e = unlinkunlink (nom) e = chdirchdir (nom_rep) e = chmodchmod (nom,mode)
création répertoire suppression répertoirecréation nouvelle Entréesuppression Entréechangement répertoire de Travailmodification protection de fichier
5050
Version septembre 2013 N°128
Contenu inode: statstat, fstatfstat, lstatlstat
Descripteur fichier
Nom fichier
Informationsinode
lstat: informations sur le lien symbolique luilstat: informations sur le lien symbolique lui--mêmemêmefstat: accès direct par le descripteur ce fichierlstat accès par le nom de fichierlstat accès par le nom de fichierMise à jour des tables internes (noyau)
Version septembre 2013 N°129
Informations sur un fichier
#include <sys/types.h>#include <sys/stat.h>#include <unistd h>#include <unistd.h>int main () {
int fd, e;struct stat buf;... e = statstat ("/etc/passwd",&buf);/* autre possibilité */fd ("/ t / d" )fd = openopen ("/etc/passwd", ...);e = fstatfstat (fd, &buf);printf ("Nombre liens: %d", buf.st_nlink);
}Macros POSIX: S_ISREGS_ISREG(m), S_ISDIRS_ISDIR(m), I_SRWXUI_SRWXU
Commande(s) associée(s): lsStructure(s) interne(s): inode
5151
Version septembre 2013 N°130
statstat, fstatfstat, lstat lstat (compléments)
Protections + type de fichiers
Numéro dans /etc/passwd/etc/passwd
Numéro dans /etc/group/etc/group
pp
Taille en octets
Dates : modification Inode, accès et modifications du
contenucontenu
N° inode sur disque
Nombre liens en dur
+ st_dev et r_dev : majeur/mineur+ st_blksize et st_blocks
! !
Version septembre 2013 N°131
Obtenir le type d’un fichier
struct stat
st_modest_mode
.
.
.
Extraire le type
<sys/stat.h>
.
5252
Version septembre 2013 N°132
Obtenir les droits d’un fichier
if(st->st_mode & S_IRUSR) …
struct stat
st_modest_mode
.
.
.
if(st->st_mode & S_IWUSR) …
if(st->st_mode & S_IXUSR) …
if(st->st_mode & S_IXGRP) ……
…
Macros sur les protections : voir openopen
<sys/stat.h>
.if(st->st_mode & S_IXOTH) …
…
Version septembre 2013 N°133
Obtenir le nom de login / groupe
lahire:x:1543:34:Philippe Lahire:/home/lahire:bin/bash
t t d* t id ( id t id)
struct stat
st_uidst_uid
.
.=
struct passwd* getpwuid (uid_t uid)
st gidst gid
prof:x:34:Professeurs:lahire …
st_gidst_gid
struct group* getgrgid (gid_t gid)
Voir getpwent (3)getpwent (3)
= /etc/passwd
/etc/group
+/etc/shadow
5353
Version septembre 2013 N°134
Synthèse getpwent(3)
Adresse de la structure si résultat OKNULL si uid ou gid n’existe pasChamps « passwd »,« passwd_gr » : adminstrateur
Version septembre 2013 N°135
Information sur les périphériques
struct stat.
macros
st_dev: du S.F. qui contient le fichier
#include <sys/types.h>#include <sys/types.h>int minor (dev_t d)int minor (dev_t d)int major (dev_t d)int major (dev_t d)
st_devst_dev
.
.
st_rdevst_rdev
_ qst_rdev: du fichier spécial (si /dev/…)Majeur = classe de l’appareilMineur = numéro d’instance de la classe création par mknod(8) ou /dev/MAKEDEV
5454
Version septembre 2013 N°136
Manipuler des dates (1)
struct stat. fonctions Retour: NULLNULL si ¬OK
Dates GMT : nb sec. depuis 01/01/1970 à 12 PM
#include <time.h>#include <time.h>struct tm* localtime (const time_t t)struct tm* localtime (const time_t t)struct tm* gmtime (const time_t t)struct tm* gmtime (const time_t t)st_mtimest_mtime
.
st_ctimest_ctime
st_atimest_atime
pst_atimest_atime ((read), st_mtimest_mtime (write) st_ctimest_ctime ((creat, chmod, chown…)localtimelocaltime : fuseau (config. Syst.) + heure été/hivergmtimegmtime : temps GMT universel
Version septembre 2013 N°137
Manipuler des dates (2)
timetime
Passer d’un Format à un autrePasser d’un Format à un autre
mktimemktime
asctime, asctime, asctime_rasctime_r
ctime,ctime,ctime_rctime_r
5555
Version septembre 2013 N°138
Manipuler des dates (3)
en secondes
À
fourni par « l’utilisateur »
À partir d’un struct tmtm
ctime_r + asctime_r: résultat = pointeur sur «ctime_r + asctime_r: résultat = pointeur sur « buf »»Transformation de la date (seconde ou struct tm) en chaîne de caractèresLe résultat est internationaliséLe résultat est internationalisé
Version septembre 2013 N°139
Manipuler des dates (4)
Si ¬NULL: modification
d l d tde la « date »
Date au format
Heure du système
« struct tm »
Date au format « time_t »
date(1) = printf(« %s\n », ctime(time())ctime(time()))
5656
Version septembre 2013 N°140
Manipuler des dates (5)
Buffer + taille pour la sortie
Heure à formater
Voirstrftime (3)
Exemple de format
Version septembre 2013 N°141
Internationalisation (1)
Agir sur les variables d’environnement :LC TIME : conventions utilisées pour les datesLC_TIME : conventions utilisées pour les datesLC_MONETARY, LC_COLLATE, LC_TYPE, LC_NUMERIC, LANGSigne monétaire, jeu de caractères, ordre alphabétique…
LC_ALL: S’applique à tous
enen (anglais)dede (allemand) ……
5757
Version septembre 2013 N°142
Internationalisation (2)
Paramétrer un programme pour l’internationalisation :#include <locale.h>setlocale (LC_ALL, « »);setlocale (LC_ALL, « fr_FR »);…
Laisser la libertéLaisser la libertéImposerImposer
time_t
struct tm
char …[MAX]
Version septembre 2013 N°143
Manipuler les dates d’un fichier (1)
Nom du fichier
Nouvelles « dates »
t ti
La date associée à l’inode est mise à jourtimes = NULL ⇒ date couranteil faut avoir les droits en écriture sur le fichier
st_atimest_mtime
5858
Version septembre 2013 N°144
Manipuler les dates d’un fichier (2)
#include <sys/types.h>#include <utime.h> i t i () int main () {
int fd, e;struct utimbuf tbuf;... tbuf.actime = ... tbuf.modtime = ... e = utimeutime ("/etc/passwd", &tbuf);( p , f);
}
Commande(s) associée(s): ls, touchStructure(s) interne(s): inode
Version septembre 2013 N°145
Gérer le propriétaire d'un fichier(1)
d f h
Kernel: CAP_CHOWN
Nom du fichier
Propriétaire& groupe
Descripteur de fichier
chown ≈ fchownlchown lchown (lien symbolique) chown chown (fichier référencé)MAJ de st_ctime st_ctime (c’est normal?)
fichier
Il y a aussi chgrpchgrp
5959
Version septembre 2013 N°146
Gérer le propriétaire d'un fichier (2)
#include <sys/types.h>#include <unistd.h>int main () int main () {
int fd, e;... e = chownchown ("/etc/passwd", 1014, 50);/* autre possibilité */fd = openopen ("/etc/passwd", ...);e = fchownfchown (fd, 1014, 50);
}}
Commande(s) associée(s): chownStructure(s) interne(s): inode
Version septembre 2013 N°147
Créer un lien (en dur)
Nom initial
Sorte d’alias…Incrémentation du nombre de liens en dur
Nom du lien
Incrémentation du nombre de liens en durAppartenance au même Système de FichiersPas de liens en l’air (gestion par le système)Efficacité: pas de fichier intermédiaireMais: retrouver les noms « à la main »…
6060
Version septembre 2013 N°148
Créer un lien symbolique
Nom initial
Nom du lien
nombre de liens en dur sur newpathnewpath: 12 inodes : celle du lien et celle du fichier ⇒ Efficacité vs lisibilité
Liens en l’air possiblesLien à travers les systèmes de fichiers
Version septembre 2013 N°149
Supprimer un lien
d f hNom du fichier
Effacement d’un lien en durEffacement du fichier si c’est le dernierIl faut avoir les droits…Il faut avoir les droits…
6161
Version septembre 2013 N°150
Création/suppression d'un lien
#include <unistd.h>int main () int main () {
int e;... e = linklink ("/etc/passwd", "/tmp/passwd");e = symlinksymlink ("/etc/passwd", "/tmp/passwd");e = symlinksymlink ("/etc", "/tmp/etc");
Le fichier lien symbolique
e = unlinkunlink ("/tmp/passwd"); e = unlinkunlink ("/tmp/etc");
}Commande associée(s): ln, unlink, rmStructure(s) interne(s): inode
Version septembre 2013 N°151
Rappel sur les droits d’accès (open)
Pour donner des droits
Le propriétaire
Le Groupe propriétairee G oupe p op éta e
Les autres
6262
Version septembre 2013 N°152
Vérifier l’accès à un fichier
Nom du fichier
modemode = droit de …
fichier
Droits demandés
R_OKR_OK: lectureW_OKW_OK: écritureX_OKX_OK: exécution ou traverséeF_OKF_OK: existence
Version septembre 2013 N°153
Gérer les protections d’un fichier (1)
Nom du fichierfichier
droits
DescripteurDe fichier
modemode = combinaison des 3 permissions pour les 3 catégories et de 3 indicateurs⇒⇒ S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IROTHS_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IROTH⇒⇒ S_ISUID | S_IRGRP | S_IROTHS_ISUID | S_IRGRP | S_IROTH
Indicateurs…
6363
Version septembre 2013 N°154
Gérer les protections d’un fichier (2)Fichiernormal
(*)
Répertoire
(*)
3 indicateurs : interprétation ≠ (fichier normal / répertoire)(*) gestion de verrou si ¬exécutable (voir cours)
Version septembre 2013 N°155
Gérer les protections d'un fichier (3)
#include <sys/types.h>#include <sys/stat.h>int main () {
int fd, e;... e = chmodchmod ("/etc/passwd", S_IRWXU);/* autre possibilité */fd = openopen ("/etc/passwd", ...);pp ( p , );e = fchmodfchmod (fd, S_IRWXU);
}
Commande(s) associée(s): chmodStructure(s) interne(s): inode
6464
Version septembre 2013 N°156
Manipuler le masque de protection
Nouveau masque
Utilisation des 9 macros Utilisation des 9 macros 3 permissions pour les 3 catégories
modemode idem chmodchmodmodemode = idem chmodchmodS_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IROTHS_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IROTH
Mais : marque une interdictionSe combine avec ce qui est donné par open: ETS’applique au futur fichiers créés
Version septembre 2013 N°157
Protections de fichier et processus (1)
Processus PP
RUIDEUIDSUID
RGIDEGIDSGID
real user-id
effectiveuser-id
real group-id
effectivegroup-id
saved set saved setsaved setuser-id
sa ed setgroup-id
6565
Version septembre 2013 N°158
Protections de fichier et processus (2)
Processus PP=Sauf si
login + group(s)=sauf si
RUIDEUIDSUID
RGIDEGIDSGID
set-user-id sauf si set-group-id
ownerowner
Restaurer aprèsRestaurer après«« set/drop privilegeset/drop privilege »»
Fichier de PP
ou
ownerownergroupgroup
OU: utilisation de :setuid, setgid (posix)setreuid, setregid…Avoir les privilèges
Différents effets : cours sur les processus
Contrainte (si EUID != 0):new = RUID/SUID
Version septembre 2013 N°159
Appels systèmes et liens symboliques
S’applique surS’applique sur…
Le fichier lien symbolique :Le fichier lien symbolique :lchown, chown, lstat, readlink, unlinkremove, rename
Le fichier luiLe fichier lui--même :même :chmod, creat, chown, link, mkdir, open, stat access, chdir, exec, mkfifo, opendir, pathconf, truncate, rename
6666
Version septembre 2013 N°160
Créer/Supprimer un répertoire (1)
Nom du répertoire
droits
S_ISGIDS_ISGID : droits du gr. Du répertoire = droits de ses fichiersS_ISVTXS_ISVTX : création de fichiers ¬renommer & ¬supprimerS_IX… S_IX… : X est pour « traverser »rmdirrmdir: le répertoire doit être vidermdirrmdir : fonctionne comme unlinkunlink
Version septembre 2013 N°161
Créer/supprimer un répertoire (2)
#include <sys/types.h> #include <sys/stat.h> i t i () int main () {
int e;... e = mkdirmkdir ("/tmp/myrep", S_IWUSR);e = rmdirrmdir ("/tmp/myrep");
}
Commande(s) associée(s): mkdir, rmdir, rmStructure(s) interne(s): inode
6767
Version septembre 2013 N°162
Ouvrir un répertoire
Nom du répertoirerépertoire
DIRDIR : un peu comme FILE (section 3)Curseur placé sur la 1ère entréeCombien d’entrée minimum?
Version septembre 2013 N°163
Parcourir un répertoire
«descripteur»
N° inodeNom fichier
Seul endroit où est stocké un nom de fichierAvance le curseur
Et le chemin ?
6868
Version septembre 2013 N°164
Réinitialiser/Fermer un répertoire
«descripteur»
(*)
(**)
(*) Position sur la 1ère entrée (affecte table noyau)(**) Affecte la TDF et les tables du noyau(**) rend les ressources aux système
(**)
Version septembre 2013 N°165
Réinitialiser/Fermer un répertoire
«descripteur»
(*)
(**)
(*) Position sur la 1ère entrée (affecte table noyau)(**) Affecte la TDF et les tables du noyau(**) rend les ressources aux système
(**)
6969
Version septembre 2013 N°166
Accès au contenu d'un répertoire
#include <sys/types.h>#include <dirent.h>i t i () {int main () {
DIR* dir;struct dirent * entry;dir = opendiropendir ("/var"); entry = readdirreaddir (dir);printf ("%s - %d", entry->d_name, entry->d_ino);closedirclosedir(dir);
}}seekdirseekdir, telldirtelldir, ...
Commande(s) associée(s): ls, mv, …Structure(s) interne(s): tables des fichiers
Version septembre 2013 N°167
Manipuler le répertoire courant (1)
Nom de fichier
«descripteur»
fichier
Affecte le contenu d’un processusAllocation de bufbuf + taille allouée
Chemin absolu
7070
Version septembre 2013 N°168
Manipuler le répertoire courant (2)
#include <unistd.h>int main () { {
int fd, e;... e = chdirchdir ("/etc");/* autre possibilité */fd = openopen ("/etc", ...);e = fchdirfchdir (fd);
}}Table des fichiers: Changement nombre de références
Commande(s) associée(s): cdStructure(s) interne(s): Tables des fichiers, processus
Version septembre 2013 N°169
Renommer / Déplacer un fichier
Fichier de départ
newpathnewpath dans le même système de fichiersAutres liens en du non affectés
Fichier d’arrivée
Autres liens en du non affectésSi cible existe elle est écraséeNombreuses restrictionsChemin correct, cible: répertoire non vide,…
Commande mvmv
7171
Version septembre 2013 N°170
Synchronisation Disque/buffer
Descripteur de fichier
syncsync: synchronise les buffers (écriture) et disques fsyncfsync: idem mais pour un fichierDifférer l’écriture ⇒ accélérer les échangesToutes les xx sec. + arrêt de la machine
Version septembre 2013 N°171
Synchronisation Disque/buffer
#include <unistd.h>int main () (){
int fd, e;... /* Ouverture fichier en écriture */ fd = openopen ("/etc/passwd", ...);...
ff (fd)e = fsyncfsync (fd);syncsync () /* S. F. */
}Commande associée(s): syncStructure(s) interne(s): Tables, buffer, inode
7272
Version septembre 2013 N°181
Système de fichier /proc (1)
Processus en cours
Autres informations : mémoire, noyau, paramètres systèmes, …
Version septembre 2013 N°182
Système de fichier /proc (2)
Systèmes de fichierssupportés
Information sur la mémoire
7373
Version septembre 2013 N°183
Système de fichier /proc (3)
Information sur la table des volumes montés
Version septembre 2013 N°184
Système de fichier /proc (4)
Répertoire courantRépertoire courantExécutableExécutable
Répertoire RacineRépertoire Racine
Propriétaire, PIDPropriétaire, PID
Variables environnementVariables environnement