Upload
others
View
12
Download
0
Embed Size (px)
Citation preview
1
Programmation système &
Réseaux
Philippe Lahire
Université de Nice Sophia-Antipolis
Septembre 2015
3ème année Licence MIAGE
Version septembre 2015 N°2
Organisation du cours
Planning :
Cours: 12 séances (1h30)
TP: 12 séances (1h30)
Contrôle continu :
TP: deux à trois TP notés
un ou deux contrôles courts + contrôle terminal (1h30)
Note complémentaire :
Le travail : Motivation, Compréhension, Progression,…
La tenue : Assiduité, Respect,…
Matériel : PC sous linux
2
Version septembre 2015 N°3
Programme
Système de Fichiers
Entrée-sortie + API (read, write…)
Notion de processus + API (fork, exec…)
Tubes + API (pipe)
Signaux + API (signal, sigaction, kill…)
Langage : • principalement C
Version septembre 2015 N°4
Organisation des enseignements
cours Semaine/date TP
1 Introduction + Entrées-Sorties 37/10.09
2 Introduction + Entrées-Sorties 37/10.09
3 Systèmes de Fichiers 38/17.09 TP N°1 : E/S (1h30)
4 Systèmes de Fichiers (prog) 39/24.09 TP N°1 : E/S (1h30)
5 Systèmes de Fichiers (prog) 40/01.10 TP N°2 : Syst. Fich. (1h30)
6 Processus 41/08.10 TP N°2 : Syst. Fich. (1h30)
7 Processus (prog) 43/22.10 TP N°2 : Syst. Fich. (1h30)
8 Tubes 45/04.10 TP N°3 : Processus Fork (1h30)
9 Tubes 47/18.11 TP N°4 : Processus Fork (1h30)
10 Signaux 48/25.11 TP N°4 : Processus exec (1h30)
11 Signaux 48/26.11 TP N°5 : Tubes (1h30)
12 Révision/Rattrapage 49/02.12 TP N°6 : Signaux(1h30)
50/09.12 TP N°6 : Signaux(1h30)
50/09.12 TP Révision/ Rattrapage
Contrôle Terminal ??
Prévision
3
Version septembre 2015 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)”,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.
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, 1996
10. A.D. Solomon “Le guide officiel sur l’architecture et le noyau Windows NT” 2nd ed., Microsoft Press, 1998.
11. Site microsoft
C
Conce
pts
Unix
Win
dow
s
Chapitre 1: Présentation générale
4
Version septembre 2015 N°9
Chapitre 1: Présentation générale
Historique des systèmes UNIX
Vers une normalisation: POSIX
Unix propriétaires ou Linux
Survol de l'architecture
Noyau du système
Principales caractéristiques
Rappels des notions de base: le Shell
Principales commandes
Interprétation de commande
Notion de base: La session, le manuel,…
Parallèle avec Windows
Version septembre 2015 N°10
Historique des systèmes UNIX (wikipedia)
5
Version septembre 2015 N°11
Historique des systèmes Windows (wikipedia)
Version septembre 2015 N°12
Vers une normalisation: POSIX
Portable Open System Interface eXchange
Norme IEEE & Description: 1003.0: Guide et présentation
1003.1: Bibliothèque de fonctions
1003.2: Shell et utilitaires
1003.3: Méthode de tests et conformité
1003.4: Extension temps réel
1003.5: Form. appels systèmes en ADA
1003.6: Sécurité
1003.7: Administration système
1003.8: Accès commun aux fichiers
1003.9: Interface sous Fortran 77
1003.10: Interface supercalculateurs
Normes: ISO 9945-1 (P1003.1)
Posix 1, 1b, 1c: 1998, 1993, 1995
6
Version septembre 2015 N°13
Unix propriétaires ou Linux…
Linus Torvald (FIN-91 sur i386)
Philosophie 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és
Un “excellent produit”: stable et code original “libre de droits”
Porté un grand nombre d'architectures :
SPARC, INTEL, ALPHA, MAC, …
Quelques projets: Apache
Gnome
GNU
Version septembre 2015 N°15
Survol de l'architecture (1)
MATERIEL: UC, mémoire, disques, terminaux, etc…
SYSTEME D’EXPLOITATION UNIXGestion des processus, de la mémoire, des E/S,…
BIBLIOTHEQUE STANDARDfopen, fclose, fread, fwrite,…
PROGRAMMES UTILITAIRES STANDARDShell, éditeur, compilateur, …
UTILISATEUR
Interface Bibliothèques
Interface Appels Systèmes
Interface Utilisateur
Autre système en couche : logiciels réseaux suivant norme - OSI
7
Version septembre 2015 N°18
Noyau du système
PARTIE MATERIELLE
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
BlocCaractère
Contrôleurs de périphériques
Contrôle de la partie matérielle
Version septembre 2015 N°20
Principales caractéristiques
Langage de haut niveau
Le noyau : plus d'1 million de lignes de C
Expressivité et simplicité de l'interface
Construction de programmes: des primitives élémentaires
Un système de fichiers « hiérarchique »
Un format cohérent de fichier (octet)
Accès aux périphériques
Multi-utilisateurs et multitâches …
Indépendance avec l'architecture matérielle
54 % du code
Mémoire virtuelle (versions actuelles)
8
Version septembre 2015 N°22
Notion d’interprète de commandes
Shell : Interface textuelle vers le système
Fonctionnalités
Message d'invitation (prompt)
Attend la saisie d'une commande
Commandes internes
Commandes externes (charg. + exec. programmes)
Historique 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 2015 N°23
Différents shells unix possibles
Bourne shell (historiquement, le 1er)
Toujours 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
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
Où indiquer le shell par défaut ?
9
Version septembre 2015 N°24
Quelques éléments d’administration
/etc/passwd
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
nom_du_compte : mot_de_passe : numero_utilisateur : numero_de_groupe : commentaire : répertoire : programme_de_demarrage
/etc/group
nom_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 2015 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
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
Pas en C
10
Version septembre 2015 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 commandes
apropos: recherche de mots clés
Version septembre 2015 N°36
Anatomie d’une page de manuel (1)
Section
Brève de scr ip t ion
Syn t a xe s poss ib le s
De scr ip t ion d é t a illé e d e la com m a n d e
Pr om p t d u « PAGE R »
De scr ip t ion dé t a illé e de s
opt ions (or dr e a lpha 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 ch e r ch e r « xy »
11
Version septembre 2015 N°37
Anatomie d’une page de manuel (2)
Au t r e s pa ge s in t é r e ssa n t e s
su r un su je t vois in
N ul n ' e s t pa r fa it . . .
Pa r fois a m bigu ë s ou con fu se s
Ve r s ion a ng la ise (dé fa u t ) :unset LANG LC_ALL
pu is m a n à n ouve a u ...
Version septembre 2015 N°39
Principe général d'utilisation
main (){
}
........R1 (23)
/* Fichier Y.c */
#include "Z2.h"
/* Fichier Z2.h */
Z2.o
Z1.o
Z3.o
R1 (int i)
........R1 (int i) {......}.......
Zlib.a
a.out
Y.o
EDITION DE LIEN
COMPILATION
PREPROCESSEUR
/* MAN !!!!! */
man r1
12
Version septembre 2015 N°40
Exception vs compte-rendu
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
pas remise à zéro à chaque appel.
intro(2) : liste des différents codes
Méthodologie : test compte-rendu + errno
Traitement standard des erreurs (1)
• normale : positive ou nulle, non void ,• anormale : négative ou void
entierpointeur…
Version septembre 2015 N°41
Fonctions associées#include <string.h>
char* strerror (int errnum)
retourne message « en clair » associé à errnum
#include <stdio.h>
void perror (const char* message)
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 »)
Traitement standard des erreurs (2)
13
Version septembre 2015 N°42
Exemple#include <string.h>
#include <stdio.h>
int main (int argc, char* argv[]) {
FILE* fichier;
if (argc != xxx) {
fprintf(stderr, « nombre paramètres incorrect »);
exit(1)
}
if ( (fichier = fopen(argv[1], « rw »)) == NULL) {
fprintf(stderr,«Erreur %i:%s \n », errno, strerror(errno));
exit(2); }
}
Traitement standard des erreurs (3)
ici > 1
Version septembre 2015 N°43
Traitement des erreurs de W. Stevens (1)
format message d’erreur avec nb % + nb arguments
Affiche aussi le message associé à errno
+ return
+ exit(1)
+ abort
Macros : en majuscule et sans paramètrePas de message passé en paramètre mais :Affichage: Nom du fichier + numéro de ligne
14
Version septembre 2015 N°44
Exemple
#include <stevens.h>
#include <stdio.h>
int traiter_fichier (char* f) {
FILE* fichier; char tab[30];
if ( (fichier = fopen(f, « rw »)) == NULL)
ERR_EXIT;
…
if (fclose(fichier)) != 0)
ERR_RETURN;
}
Pas par défaut dans linux
Traitement des erreurs de W. Stevens (2)
Chapitre 2: Entrées - Sorties
15
Version septembre 2015 N°46
Plan de travail
Principes généraux
…
Structures internes
Hiérarchie de descripteurs
Tables pour la gestion des entrées-sorties
Principaux appels systèmes
Ouverture / fermeture de fichiers: open, close
Entrées-sorties: read, write
Positionnement : lseek, fseek
Duplication en vue de redirection : dup, dup2
Version septembre 2015 N°47
Mise au point / Survol
Système exploitation
int open (….) { } int read (….) { }
Tables :•Fich. Ouvert•Volumes•Blocs•….
FILE* fopen (….) { }
Consulte / met à jour« appelle » / exécute
bash gcc emacs
Bien sur on se sert aussi du « shell »pour lancer un
programme
…
processus
16
Version septembre 2015 N°48
Principes généraux (1)
Sous UNIX: tout est fichier
Périphérique, réseau, mémoire...
Fichier = une suite d’octets
Organisation : Hiérarchie de
Système de fichiers (partitions…)
répertoires
Fichiers « normaux » (en anglais Regular)
Liens entre fichiers (symboliques et physiques)
Fichiers virtuels (/proc)
Fichiers spéciaux (périphériques,FIFO,…)
Exemples : • « hardware » (/dev) • Accès au réseau (sockets)• Tubes persistants (FIFO) • Tables du noyau (TDF)
Montage : • local • distant
Version septembre 2015 N°49
Principes généraux (2)
Méthodes d’accès
Séquentiel (read)
Direct - unité: l’octet – (lseek)
Protection
propriétaire, groupe d’utilisateurs, les autres
Pas de journal (log) mais possibilité de verrous
Généralité + simplicité
Implantation de SGBD : bonne aptitude
fichiers à trou, accès direct, octets…
mécanismes additionnels non intégrés:
évolution (gestion des versions), typage des données, système transactionnel (SGBD),
17
Version septembre 2015 N°50
Principes généraux (3)
Deux points de vues
Utilisateur (commandes, applications,…)
Programmeur (C et appels systèmes)
Utilisateur
échanges entre un processus et des entités : disque, machine distante, autre processus, terminal...
Programmeur
Echanges avec n’importe quelle entité par des flots d’octets consécutifs
Accès direct possible sur des disques locaux ou distants (curseur lecture/écriture)
Fichier au sens large
Version septembre 2015 N°51
Principes généraux (4)
Une suite d’octets
Curseur
Tampon
Disque
Mémoire Programme
F.D.
Descripteur de fichier :• Prédéfini (fich. Stand.)• A associer (open)
Simple numéro
18
Version septembre 2015 N°52
Principes généraux (5)
Association (open…)nom externe / Desc. Fichier
chemin relatif
chemin absolu
Pas de caractère générique
Utilisation (read, write…)Desc. Fichier: numéro de voie
obtenu par association
prédéfini : 0 : voie standard d’entrée
1 : voie standard de sortie
2 : voie standard d’erreur
chemin relatif
chemin absolu
Dans le programme Appel du programme
On n’utilise jamais directement
Le clavier ou l’écran
Version septembre 2015 N°53
Un modèle d’E/S adaptable aux langages
Un modèle d’entrée sortie de bas niveauxLangage CJava…
Impact:• Performance• Utilisation…
19
Version septembre 2015 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 Conclusion
Mode noyau et Préemption
struct FILE vs numéro d'entrée dans la TDF
lect./é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 2015 N°55
Qu'est-ce qu'un processus
Définitions
Instruction = indécomposable et indivisible
Processeur = ...
Processus = exécution d'un programme
(instructions + données)
Approche intuitive
UNIX = système "temps partagé“
Plusieurs processus en même temps
Un seul processus actif
Attente des autres (dans/hors mémoire)
20
Version septembre 2015 N°56
Table fichiersEspace utilisateur Table inodes
Tables pour gérer les fichiersPro
cess
us
P2 0
12
345
…
Pro
cess
us
P1 0
12
345
…
Position :État :Nombre :
…
Position :État :Nombre :
N° inode :Nb. copies :Inode Infos …
…
N° inode :Nb. copies :Inode Infos …
…
N° inode :Nb. copies :Inode Infos …
Tables partagées
Tables Descripteurs Fichiers
…Position :État :Nombre :…
Position :État :Nombre :
Privé
Version septembre 2015 N°57
Modèle UNIX - Synthèse
Trois points de vues
Le processus
L’usage
Le « fichier »
Deux abstractions (par point de vue)
Processus : Usage et nature du fichier
Usage : raison de l’utilisation par le processus
et la nature du fichier
« Fichier »: raison de l’utilisation et usage du fichier
Permettre le partage
D’un même usage par un/plusieurs processus
D’un même fichier par un/plusieurs processus
D’une même fichier par un/plusieurs usages
Rôles :
Gestion des voies d’échange
Gestion du curseur…
Gestion des protections…
21
Version septembre 2015 N°58
Ouverture/Création d’un fichier: open
Mise à jour des tables internes (processus + noyau)
Oflags/perm : 9/15 macros dans les fichiers .hUn petit ensemble de combinaisons valides
Les incohérences ne sont pas détectés
Lors de la création: f(perm,umask)
Mode d’ouverture
Nom fichier
Descripteur de fichier
Version septembre 2015 N°59
Ouverture/Création: open (oflags)
O_CREAT: création, si le fichier n’existe pas
O_EXCL: combiné avec O_CREAT, création si le fichier n’existe
pas, erreur sinon
O_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 fichier
O_APPEND: contenu du fichier non touché + curseur placé en
EOF
O_SYNC: attend la fin d’écriture sur le média après chaque
write (pas de cache)
O_NONBLOCK: E/S non bloquantes.
Valeurs possibles
22
Version septembre 2015 N°60
Ouverture/Création: open (oflags)
O_CREAT si la création est permise ¬ O_RDONLY
O_EXCL si le fichier ne doit pas déjà exister O_WRONLY +
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.
Règles et choix incohérents
Choisir l’un des 3 types exclusifs d’action :
O_RDONLY, O_WRONLY, O_RDWR
+
Version septembre 2015 N°61
Ouverture/Création: open (oflags)
open (nomFichier, O_RDONLY)
Curseur au début du pour lire
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ù
Exemples
23
Version septembre 2015 N°62
Ouverture/Création: open (perm)
Point de vue :
du programmeur, qui propose des permissions logiques
de l’utilisateur, propriétaire des fichiers créés, qui peut interdire certaines permissions
Règle
Les permissions associées à un fichier lors de sa créationsont fixées par la conjonction de deux points de vue :
Ex: Compilateur: exécution / Editeur: lecture et écriture…
umask : pas de lecture/écriture pour les autres
Permission appliquée = perm & ~umask
Masque interdictions
Version septembre 2015 N°63
Ouverture/Création: open (perm)Valeurs possibles
Le propriétaire
Le Groupe propriétaire
Les autres
Pour donner des droits
24
Version septembre 2015 N°64
open (« f », O_WRONLY | O_CREAT,
)
Ouverture/Création: open (perm)Exemple
0 0 00 1 0 0 1 0
1 1 11 0 1 1 0 1755
022
Group = ¬write
Other = ¬write
umask
1 1 01 0 0 0 0 0
0 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
&
=
~
Version septembre 2015 N°65
Création d'un fichier
Equivalences
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
25
Version septembre 2015 N°66
Création d'un fichier:
mécanisme interneEtapesLocalisation inode parent (I.P),
Recherche nom fichier
...
Si le nom n’existe pas alors:Verrouillage I.P., liste des inodes libres
Allocation inode: inode-mémoire = get (inode-disque)
Modification I.P.: Informations fichier
Sinon (le nom existe) : Désallocation blocs: contenu fichier
Non-Modification I.P.
Importance des verrous et du mode noyau
Version septembre 2015 N°67
Processus 1
#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>int main () { int rfd, wfd, rwfd;
if ((rfd = open("/etc/bashrc",O_RDONLY)) < 0)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
Ouverture/Création d'un fichier (1)
Attention !
26
Version septembre 2015 N°68
Ouverture/Création d'un fichier (2)
Processus 2#include <sys/fcntl.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épendants
Des tables partagées et privées
Action: ouverture: rfd - ouverture: wfd
Version septembre 2015 N°69
Ouverture d'un fichier: Vision interne
Table fichiersEspace utilisateur Table inodes
Pro
cess
us
P2 0
12
345
…
Pro
cess
us
P1 0
12
345
…
Position :État :Nombre :
O_RDONLY
1
…
Position :État :Nombre :
O_RDWR
1…
Position :État :Nombre :
O_WRONLY
1
Position :État :Nombre :
1
O_RDONLY
Position :État :Nombre :
O_WRONLY
1
/etc/bashrc
N° inode :Nb. copies :Inode Infos …
12
N° inode :Nb. copies :Inode Infos …
/.bash_profile
1
…
N° inode :Nb. copies :Inode Infos …
1/.bashrc
…
3
Attention : partage possible dup/fork
27
Version septembre 2015 N°70
Fermeture d’un fichier: close
Mise à jour des tables internes (processus + noyau)
fd est une entrée dans la TDF :
open, fork, voie standard…
Fermeture par le noyau des fichiers à la terminaison d’un
processus (exit(?))
Descripteur de fichier
Version septembre 2015 N°71
Fermeture d'un fichier
Processus 2#include <unistd.h> int main () {
int rfd, wfd;/* Ouverture et utilisation */ ... close (rfd); /* exit: fermeture implicite */ close (wfd); /* exit: fermeture implicite */
}Tables fichiers/inodes
Décrémentations compteurs
Désallocations éléments
Libération complète si le compteur atteint 0
Commande(s) associée(s): exit, éditeur…
Structure(s) interne(s): tables, buffers
28
Version septembre 2015 N°72
Fermeture d'un fichier: Vision interne
Table fichiersEspace utilisateur Table inodes
Pro
cess
us
P2 0
12
345
…
Pro
cess
us
P1 0
12
345
…
Position :État :Nombre :
O_RDONLY
1
…
Position :État :Nombre :
O_RDWR
1…
Position :État :Nombre :
O_WRONLY
1
/etc/bashrc
N° inode :Nb. copies :Inode Infos …
12
Position :État :Nombre :
1
O_RDONLYN° inode :Nb. copies :Inode Infos …
/.bash_profile
1
…
N° inode :Nb. copies :Inode Infos …
1/.bashrc
…
Position :État :Nombre :
O_WRONLY
1
3
null
null
Version septembre 2015 N°73
Lecture d’un fichier: read
Mise à jour des tables internes (noyau)
fd est une entrée dans la TDF ouverte en lecture :
open, fork, voie standard…
Allocation de buffer impérative
Nb octets lus ≤ Nb octets à lire (EOF, périphérique,…)
Début = position du curseur Après = position + nb oct.lus
Descripteur fichier
Lieu de stockage données lues
Nombre octets à lire
Nombre octets lus
29
Version septembre 2015 N°74
Lecture d'un fichier
Processus 1#include <sys/types.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);
}
Lecture à travers une même entrée
Commande(s) associée(s): cat, more, emacs, ...
Structure(s) interne(s): tables, blocs, buffers
Version septembre 2015 N°75
Lecture d'un fichier: Commentaires
Verrouillage/partage
Durée d'un read
Verrouillage explicite possible
Schéma lecteur/écrivain possible
Plusieurs descripteurs possibles
Lecture réelle
Attention: Lecture bloc par bloc
Bloc dans le "buffer cache" ou sur le disque?
Lecture anticipée
30
Version septembre 2015 N°76
Lecture d'un fichier
Processus 1#include <sys/types.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);
}
Lecture à travers plusieurs entrées – attentionIci: 2 descripteurs indépendance
fork: "2" descripteurs dépendance
Version septembre 2015 N°77
Lecture d’un fichier (2)
31
Version septembre 2015 N°78
Mise à jour des tables internes (noyau)
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
Ecriture dans un fichier: write
Descripteur fichier
Données à écrire
Nombre octets à écrire
Nombre octets écrits
Version septembre 2015 N°79
Ecriture dans un fichier
Processus 1#include <sys/types.h> #include <unistd.h> int main () {
int wfd, nb;char tab[30];/* Ouverture wfd */ /* Remplissage de tab */ ... 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
32
Version septembre 2015 N°80
Ecriture dans un fichier (2)
Version septembre 2015 N°81
Ecriture d'un fichier: commentaires
Verrouillage/partage
Durée d'un write
Verrouillage explicite possible
Schéma lecteur/écrivain possible
Plusieurs descripteurs possibles
Ecriture réelle
Allocation de blocs par nécessité (indirect, données)
Ecriture partielle Lecture du bloc
Ecriture différée des blocs: "buffer cache"
33
Version septembre 2015 N°82
Positionnement dans un fichier: lseek
Mise à jour des tables internes (noyau)
fd est une entrée dans la TDF ouverte en écriture :
open, fork, voie standard…
Retour = position par rapport au début du fichier
Référentiel = SEEK_SET, SEEK_CUR, SEEK_END
déplacement positif/négatif
avant (resp. après) le début (resp. fin)
Descripteur fichier
Référentiel
déplacement
position
Entier 64 bits
Version septembre 2015 N°83
Positionnement : commentaires
Référentiel :
SEEK_SET : par rapport au début
SEEK_CUR: par rapport au curseur
SEEK_END :par rapport à la fin
Comment connaitre la position courante?
On peut se positionner après la fin
Toute écriture crée des trous
La lecture de trous rend des octets nuls
Une position négative est souvent une erreur
34
Version septembre 2015 N°84
Positionnement dans un fichier
#include <sys/types.h>#include <unistd.h>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équentiel
lseek accès direct
Pas d'accès disque
Commande(s) associée(s): éditeur…
Structure(s) interne(s): tables des fichiers
Version septembre 2015 N°85
Duplication d’entrée: dup2
Mise à jour des tables internes (processus et noyau)
fd1 est une entrée dans la TDF
fd2 est une entrée libre (ou qui sera fermée)
le contenu de fd1 est recopié dans fd2 + MAJ de
compteurs de références
dup réalise la copie dans la première entrée libre
Descripteur fichier à dupliquer
Descripteur fichier où copier
35
Version septembre 2015 N°86
Duplication d’entrée: dup
Idem à dup2
La copie se fait dans la 1ère entrée libre fl
le contenu de fd1 est recopié dans fl + MAJ de compteurs
de références
Il est nécessaire de connaître l’état de la TDF
Descripteur fichier à dupliquer
Démarche1. Sauvegarde de fd2 (dup)2. Recopie de fd1 dans fd23. Restauration (dup2 + close)
Version septembre 2015 N°87
dup: mécanismes de base (1)
Table fichiersEspace utilisateur Table inodes
Pro
cess
us
P1 0
12
345
…
Position :État :Nombre :
O_RDONLY
1
…
Position :État :Nombre :
O_RDWR
1
/etc/bashrc
N° inode :Nb. copies :Inode Infos …
2
2
36
Version septembre 2015 N°88
dup: mécanismes de base (2)
Fonctionnement général
Duplication du descripteur de fichier
Table des fichiers (ouverture): incrémentation des références
Table des fichiers (fermeture): décrémentation des références
Table des inodes: pas de modification
Deux accès au même buffer
Utilisation
dup et dup2 (routine)
Implémentation du shell: redirections E/S
Liens avec les structures internes: voir open
Version septembre 2015 N°89
dup: exemple simple
#include <sys/types.h>#include <unistd.h>#include <fcntl.h>int main () {
int fd, nfd;char tab1[512], tab2[512];fd = open ("/etc/bashrc", O_RDONLY); /* ex: fd = 3 */ ... nfd = dup (fd); /* ex: nfd = 6 */ read (fd, tab1, 512);read (nfd, tab2, 512);close (fd);read (nfd, tab2, 512);...
}
37
Version septembre 2015 N°90
dup2: exemple simple
#include <sys/types.h>#include <unistd.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 */
read (fd, tab1, 512);read (nfd, tab2, 512);close (fd);read (nfd, tab2, 512);...
}
Version septembre 2015 N°91
dup:
exemple de la redirection en shell
#include <sys/types.h>#include <unistd.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 ... */close (stdout); nfd = dup (fd); /* nfd = stdout */close (fd); exec de la commande}
...
} ... }
38
Version septembre 2015 N°92
A propos de fcntl
Commande :
fcntl (fd1, F_DUPFD, 0) dup (fd1) si 0 est libre
F_GETFL : attributs positionnés lors de open
F_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
Descripteur fichier
Commande sur fd
Arguments de la commande
Version septembre 2015 N°93
A propos de ioctl
Commande :
Opérations sur un périphérique
Pas une commande POSIX
Grand nombre de commande qui dépendent du matériel…
Descripteur fichier
Commande sur fd
Arguments de la commande
39
Version septembre 2015 N°94
Opérations atomiques ou pas ?
Attention :
Programmation mono ou multi processus
On peut être interrompu entre deux instructions
Chapitre 3: Systèmes de fichiers
40
Version septembre 2015 N°97
Table fichiersEspace utilisateur Table inodes
Structures d’un système de fichiersPro
cess
us
P2 0
12
345
…
Pro
cess
us
P1 0
12
345
…
Position :État :Nombre :
…
Position :État :Nombre :
N° inode :Nb. copies :Inode Infos …
…
N° inode :Nb. copies :Inode Infos …
…
N° inode :Nb. copies :Inode Infos …
Tables partagées
Tables Descripteurs Fichiers
…
Position :État :Nombre :…Position :État :Nombre :
Privé
Version septembre 2015 N°98
Les périphériques
Quelques informations pour commencer
Périphériques = fichiers spéciaux
Fichiers b et c
Périphériques “caractères”
terminal, réseaux
Périphériques “blocs”
Disques, bandes, Cd-rom
Interface commune: appels systèmes
41
Version septembre 2015 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écifiques
Protections, exportation…
Montage/démontage dynamique
mount, umount (commande ou appel système)
Une hiérarchie de noms
Fichiers normaux, répertoires, spéciaux, liens, tubes…
Partitionnement des sous-hiérarchies
Allocation du média associé (blocs libre…)
Deux niveaux d’organisation:
Logique (suite de blocs, unité d’allocation 1k?)
Physique (secteurs, pistes, cylindres)
Version septembre 2015 N°101
Arborescence
et volumes
+ partition de swap
+ partition de swap
/dev/rz1a
/dev/rz2a
oracle
etud
/dev/rz0g
/dev/rz0a
sharedusr
/
/dev/rz2g
Root filesystem
Swap
…
Syst. Fic. virtuel
42
Version septembre 2015 N°102
Création/utilisation Système de fichiers
Création
mkfs (Syst. Fichiers)
Taille des blocks
Nombre d’inodes
…
Utilisation
mount/umount
Type Système de fichier
EXT2
Fiable, mature
Support pour fsck
Pré allocation
Liens symboliques rapides
Redémarrage après crash lent
EXT3
Compatible avec EXT2
Mêmes structures de données
≈ EXT2 + Journalisation
Ecriture dans un journal
Ecriture dans le syst. fichiers
Version septembre 2015 N°103
Montage et démontage
Commande mount / umount
Montages locaux / distants
Visualisation: df
exemple:
mount -t ext2 -o nodev,nosuid,noexec /dev/sda3 /usr
Automatisation
Fichiers: /etc/fstab
/etc/init.d/* …
43
Version septembre 2015 N°105
Le super-bloc
Gestion des blocs
Nombre blocs libres
« Liste » blocs libres
Bitmap blocs libre/occ.
Gestion des inodes
Nombre total inodes
Compteur inodes libres
« Liste » inodes libres
Bitmap inode libre/occupé
Gestion globale
Taille système fichiers
Indicateur de modification
Duplication dans les groupes
Super-bloc … … 1 b
Gr. Blocs 0
…Descr. De gr. n b
… 1 bBitm. blocsBitm. inodes 1 b…
n bTab. inodes …
Blocs Fichiers
Blocs libres
n bTab. blocs
…
Gr. Blocs n
Version septembre 2015 N°106
Maintien de la cohérence FSCK 1/2
Qui ?: L'administrateur
Pourquoi ?: Synchronisation (sync)
Blocs: cache buffer disque
Inode: Copie en mémoire disque
Super-bloc: Copie en mémoire disque
Quand ?:
Réparation: Crash, Coupure alimentation
Prévention: Au reboot
Réparation: Attention aux pertes de données !!
44
Version septembre 2015 N°107
Maintien de la cohérence FSCK 2/2
Objectifs: Vérifications, réparations
Blocs:
Appartenances à plusieurs inodes
Non référencés
Inodes:
Tailles fichier/répertoire incohérentes
Nombres de liens incorrects
Mauvais formats
Non référencés
Super-bloc:
Plus de blocs que possible
Mauvais format de la liste des blocs libres
Total des blocs/inodes libres incohérents
Blocs libres manquants
Version septembre 2015 N°108
Montage/démontage et structures
internes
Table inodesTable volumes
…
…
N° inode :Nb. copies :Inode Infos …
N° inode :Nb. copies :Inode Infos …
…
N° inode :Nb. copies :Inode Infos …
N° inode :Nb. copies :Inode Infos …
…
SuperBloc :Inode cible :Inode à monter :Syst. Fichier :
…
SuperBloc :Inode cible :Inode à monter :Syst. Fichier :
…
mount
/dev/sda3
/
-t ext2
… copie mémoire
mount
/dev/sda7
/usr
-t ext2
45
Version septembre 2015 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, …
/home Répertoires utilisateurs
Version septembre 2015 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/share Fichiers paquetages de l'instal.
/usr/sbin Binaires administration
46
Version septembre 2015 N°111
Filesystem Hierarchy Standard (2004)
Bin : Essential command binaries
Boot : Static files of the boot loader
dev : Device files
etc : Host-specific system configuration
lib : Essential shared libraries and kernel modules
media : Mount point for removeable media
mnt : Mount point for mounting a filesystem temporarily
opt : Add-on application software packages
sbin : Essential system binaries
srv : Data for services provided by this system
tmp : Temporary files
usr : Secondary hierarchy
var : Variable data
Root filesystem
Uniformisation des distributions
(extrait)
Version septembre 2015 N°112
Organisation logique: la réalité
Une forêt de liens
Un nom = un lien
Liens:
Entre père et fils
Entre frères
Mise en oeuvre
Commandes associées: ln et unlink
Liens: dur et symboliques
Par rapport aux inodes:
lien en dur [N:1] un inode
lien symbolique [1:1] un inode
47
Version septembre 2015 N°113
Organisation logique: la réalité
etud
shared
home
etud2
/
etud1
oracle
etud1
usr
.profile
.profile
Gprofile
etud2
Lien en dur
Lien symbolique
Lien en dur
Même partition
Un seul fichier
Lien symbolique
≈Raccourci
Pas de vérification
Version septembre 2015 N°114
Protections: groupes / utilisateurs
Principaux éléments
Grain: le fichier
Opérations:
lecture, écriture,
exécution/traversée
Objet: utilisateur, groupe, autres
Ne pas confondre:
Groupe de l'utilisateur et groupe d'un fichier
Fichier /etc/group
Commande newgrp (processus)
Commande chgrp (fichier)
Liens symbolique / physique
48
Version septembre 2015 N°115
Protections: de fichier/répertoire
Les fichiers r: permission de lire le fichier
w: permission d’écrire le fichier, i.e. ajouter, supprimer ou modifier les données qu’il contient
x: permission d’exécuter le fichier
Les répertoires r: 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 les fichiers qu’il contient
x: 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.“
u g o
Version septembre 2015 N°116
Protections:
exemple
rwxrwxrwx REP-1
rwxrwxrwx
rwxrwxrwx
rwxrwxrwxrwxrwxrwx
rwxr-xr--
REP-2 REP-3
FIC-1
rwxrwxrwx
REP-5
REP-4
LIEN-1
REP-6
FIC-2
rwxr-----
r-xr-xr-x
PL,PROF PL,PROF
PL,PROF
PL,PROF
PL,PROF
PL,PROF
PL,PROF
PL,PROF
PL,PROF
Utilisateurs: RC, PROF / JPP, ETUD1
Commandes: ls, cd, touch
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 =
Les droits qui comptent(voir chmod)
49
Version septembre 2015 N°119
Structure générale d'un fichier
Qualités requises:
Evolution de la taille des fichiers
Accès efficace
Nombre de fichiers ?
Accès multi-processus
Accès multi-utilisateurs
Une structure interne
Des appels systèmes appropriés
Version septembre 2015 N°120
Structure générale d'une inode 1/2
Copie disque:
Propriétaire
Groupe propriétaire
Type fichier
Droits d'accès
Dates (accès, modification, inode)
Nombres de liens
Adresses disque (blocs)
Taille fichier
Référence ACL au fichier et répertoire
inode = anglais (i-noeud)
50
Version septembre 2015 N°121
Copie mémoire = Copie disque + …
Verrouillé ?
Processus en attente
Copie et image disque différentes
Périphérique logique
Numéro inode
Pointeurs inodes (une par liste)
liste des inodes libres
liste des inodes (adressage calculé)
Nombre copies actives
Structure générale d'une inode 2/2
Copie disque
du super bloc
Version septembre 2015 N°122
Inode de fichier/répertoire
5007105
ordinairerwxr-xr--
19/10/200510/10/200512/10/2005
5
653450 1 … 10
conte
nu aaaaaaaaaaabbbbbcccccc
ddddddddddd
5007105
répertoirerwxr-xr--
19/10/200510/10/200512/10/2005
3
3450 1 … 10
conte
nu N° Nom
Un format
ls, cd, …
UIDGID
Type fichierProtectionsDate lecture
Date modificationDate inode
Nombre liensContenu
Taille
51
Version septembre 2015 N°123
Arborescence et inodes
2010 .8010 ..1003 D1
2010
1003 .2010 ..1067 D25790 F1
1003
…
1067 .1003 ..1
067
aaaaaaaaaaaccccccc
bbbbbbbbbbbbbbbb5790
Infos inode
Infos inode
Infos inodeInfos inode
Version septembre 2015 N°124
Organisation physique
Taille max (blocs) =
10 + 256 + 2562 + 2563
ls –il
.
...
.
.
...
.
.
...
.......
...
.
.
...
.
0
1
2
3
4
5
6
7
8
9
simple
double
triple
Blocs de donnees
Taille max (blocs) =
10 +
256 +
2562 +
2563
52
Version septembre 2015 N°125
Organisation physique:
Comprendre les choix
Choix d'organisationsBlocs contiguës
Table des blocs
Compactage, nettoyage
Taille de blocs
Accès indirect
Répertoire / fichier
ConséquencesFragmentation
Efficacité (espace / temps)
Limite des fichiers
Version septembre 2015 N°126
Nom attribut
st_mode
st_ino
st_dev
st_nlink
st_uid
st_gid
st_size
st_atime
st_mtime
st_ctime
Description
Mot = bits de protection
Identif. Fich.: num. i-node
Périphérique du fichier
Nombre de liens
Ident. utilisateur
Ident. groupe
Taille en octets
Date dern. accès lecture
Date dern. accès écriture
Date dern. modification
Information sur fichiers: norme POSIX
53
Version septembre 2015 N°127
Accès aux fichiers: norme POSIX
Routine
fd = creat (nom,mode)
fd = open (fichier,mode)
e = close (fd)
n = read (fd,buff,nb)
n = write (fd,buff,nb)
p = lseek (fd,dep,deb)
e = stat (nom,&buff)
fd = mkdir (nom,mode)
e = rmdir (nom)
e = link (nom1,nom2)
e = unlink (nom)
e = chdir (nom_rep)
e = chmod (nom,mode)
Description
création nouveau fichier
ouverture fichier lecture/ecriture
fermeture fichier ouvert
lecture fichier --> tampon
écriture tampon --> fichier
déplacement dans fichier
récupération info. fichiers
création répertoire
suppression répertoire
création nouvelle Entrée
suppression Entrée
changement répertoire de Travail
modification protection de fichier
Version septembre 2015 N°128
Contenu inode: stat, fstat, lstat
lstat: informations sur le lien symbolique lui-même
fstat: accès direct par le descripteur ce fichier
lstat accès par le nom de fichier
Mise à jour des tables internes (noyau)
Descripteur fichier
Nom fichier
Informationsinode
54
Version septembre 2015 N°129
Informations sur un fichier
#include <sys/types.h>#include <sys/stat.h>#include <unistd.h>int main () {
int fd, e;struct stat buf;... e = stat ("/etc/passwd",&buf);/* autre possibilité */fd = open ("/etc/passwd", ...);e = fstat (fd, &buf);printf ("Nombre liens: %d", buf.st_nlink);
}
Macros POSIX: S_ISREG(m), S_ISDIR(m), I_SRWXU
Commande(s) associée(s): ls
Structure(s) interne(s): inode
Version septembre 2015 N°130
stat, fstat, lstat (compléments)
Protections + type de fichiers
Numéro dans /etc/group
Numéro dans /etc/passwd
Taille en octets
Dates : modification Inode, accès et modifications du
contenu
N° inode sur disque
Nombre liens en dur
+ st_dev et r_dev : majeur/mineur+ st_blksize et st_blocks
! !
55
Version septembre 2015 N°131
Obtenir le type d’un fichier
Extraire le type
<sys/stat.h>
struct stat
st_mode
.
.
.
.
Version septembre 2015 N°132
Obtenir les droits d’un fichier
Macros sur les protections : voir open
<sys/stat.h>
struct stat
st_mode
.
.
.
.
if(st->st_mode & S_IRUSR) …
if(st->st_mode & S_IWUSR) …
if(st->st_mode & S_IXUSR) …
if(st->st_mode & S_IXGRP) …
if(st->st_mode & S_IXOTH) …
……
56
Version septembre 2015 N°133
Obtenir le nom de login / groupe
lahire:x:1543:34:Philippe Lahire:/home/lahire:bin/bash
struct stat
st_uid
.
.=
struct passwd* getpwuid (uid_t uid)
prof:x:34:Professeurs:lahire …
st_gid
struct group* getgrgid (gid_t gid)
Voir getpwent (3)
= /etc/passwd
/etc/group
+/etc/shadow
Version septembre 2015 N°134
Synthèse getpwent(3)
Adresse de la structure si résultat OK
NULL si uid ou gid n’existe pas
Champs « passwd »,« passwd_gr » : adminstrateur
57
Version septembre 2015 N°135
Information sur les périphériques
st_dev: du S.F. qui contient le fichier
st_rdev: du fichier spécial (si /dev/…)
Majeur = classe de l’appareil
Mineur = numéro d’instance de la classe
création par mknod(8) ou /dev/MAKEDEV
#include <sys/types.h>int minor (dev_t d)int major (dev_t d)
struct stat
st_dev
.
.
st_rdev
macros
Version septembre 2015 N°136
Manipuler des dates (1)
Dates GMT : nb sec. depuis 01/01/1970 à 12 PM
st_atime (read), st_mtime (write)
st_ctime (creat, chmod, chown…)
localtime : fuseau (config. Syst.) + heure été/hiver
gmtime : temps GMT universel
#include <time.h>struct tm* localtime (const time_t t)struct tm* gmtime (const time_t t)
struct stat
st_mtime
.
.
st_ctime
fonctions
st_atime
Retour: NULL si ¬OK
58
Version septembre 2015 N°137
asctime, asctime_r
Manipuler des dates (2)
mktime
time
ctime,ctime_r
Passer d’un Format à un autre
Version septembre 2015 N°138
Manipuler des dates (3)
ctime_r + asctime_r: résultat = pointeur sur « buf »
Transformation de la date (seconde ou struct tm) en
chaîne de caractères
Le résultat est internationalisé
en secondes
fourni par « l’utilisateur »
À partir d’un struct tm
59
Version septembre 2015 N°139
Manipuler des dates (4)
Si ¬NULL: modification
de la « date »
Date au format « struct tm »
Heure du système
Date au format « time_t »
date(1) = printf(« %s\n », ctime(time()))
Version septembre 2015 N°140
Manipuler des dates (5)
Buffer + taille pour la sortie
Heure à formater
Voirstrftime (3)
Exemple de format
60
Version septembre 2015 N°141
Internationalisation (1)
Agir sur les variables d’environnement :
LC_TIME : conventions utilisées pour les dates
LC_MONETARY, LC_COLLATE, LC_TYPE,
LC_NUMERIC, LANG
Signe monétaire, jeu de caractères, ordre alphabétique…
LC_ALL: S’applique à tous
en (anglais)de (allemand) …
Version septembre 2015 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é
Imposer
struct tm
time_t
char …[MAX]
61
Version septembre 2015 N°143
Manipuler les dates d’un fichier (1)
La date associée à l’inode est mise à jour
times = NULL date courante
il faut avoir les droits en écriture sur le fichier
Nom du fichier
Nouvelles « dates »
st_atimest_mtime
Version septembre 2015 N°144
Manipuler les dates d’un fichier (2)
#include <sys/types.h>#include <utime.h> int main () {
int fd, e;struct utimbuf tbuf;... tbuf.actime = ... tbuf.modtime = ... e = utime ("/etc/passwd", &tbuf);
}
Commande(s) associée(s): ls, touch
Structure(s) interne(s): inode
62
Version septembre 2015 N°145
chown ≈ fchown
lchown (lien symbolique) chown (fichier référencé)
MAJ de st_ctime (c’est normal?)
Gérer le propriétaire d'un fichier(1)
Nom du fichier
Propriétaire& groupe
Descripteur de fichier
Il y a aussi chgrp
Kernel: CAP_CHOWN
Version septembre 2015 N°146
Gérer le propriétaire d'un fichier (2)
#include <sys/types.h>#include <unistd.h>int main () {
int fd, e;... e = chown ("/etc/passwd", 1014, 50);/* autre possibilité */fd = open ("/etc/passwd", ...);e = fchown (fd, 1014, 50);
}
Commande(s) associée(s): chown
Structure(s) interne(s): inode
63
Version septembre 2015 N°147
Créer un lien (en dur)
Sorte d’alias…
Incrémentation du nombre de liens en dur
Appartenance au même Système de Fichiers
Pas de liens en l’air (gestion par le système)
Efficacité: pas de fichier intermédiaire
Mais: retrouver les noms « à la main »…
Nom initial
Nom du lien
Version septembre 2015 N°148
Créer un lien symbolique
nombre de liens en dur sur newpath: 1
2 inodes : celle du lien et celle du fichier
Efficacité vs lisibilité
Liens en l’air possibles
Lien à travers les systèmes de fichiers
Nom initial
Nom du lien
64
Version septembre 2015 N°149
Supprimer un lien
Effacement d’un lien en dur
Effacement du fichier si c’est le dernier
Il faut avoir les droits…
Nom du fichier
Version septembre 2015 N°150
Création/suppression d'un lien
#include <unistd.h>
int main ()
{
int e;
...
e = link ("/etc/passwd", "/tmp/passwd");
e = symlink ("/etc/passwd", "/tmp/passwd");
e = symlink ("/etc", "/tmp/etc");
e = unlink ("/tmp/passwd");
e = unlink ("/tmp/etc");
}
Commande associée(s): ln, unlink, rm
Structure(s) interne(s): inode
Le fichier lien symbolique
65
Version septembre 2015 N°151
Rappel sur les droits d’accès (open)
Le propriétaire
Le Groupe propriétaire
Les autres
Pour donner des droits
Version septembre 2015 N°152
Vérifier l’accès à un fichier
mode = droit de …
R_OK: lecture
W_OK: écriture
X_OK: exécution ou traversée
F_OK: existence
Nom du fichier
Droits demandés
66
Version septembre 2015 N°153
Gérer les protections d’un fichier (1)
mode = combinaison des 3 permissions pour les 3 catégories
et de 3 indicateurs
S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IROTH
S_ISUID | S_IRGRP | S_IROTH
Indicateurs…
Nom du fichier
droits
DescripteurDe fichier
Version septembre 2015 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)
67
Version septembre 2015 N°155
Gérer les protections d'un fichier (3)
#include <sys/types.h>#include <sys/stat.h>
int main () {
int fd, e;... e = chmod ("/etc/passwd", S_IRWXU);/* autre possibilité */fd = open ("/etc/passwd", ...);e = fchmod (fd, S_IRWXU);
}
Commande(s) associée(s): chmod
Structure(s) interne(s): inode
Version septembre 2015 N°156
Manipuler le masque de protection
Nouveau masque
Utilisation des 9 macros
3 permissions pour les 3 catégories
mode = idem chmod
S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IROTH
Mais : marque une interdiction
Se combine avec ce qui est donné par open: ET
S’applique au futur fichiers créés
68
Version septembre 2015 N°157
Protections de fichier et processus (1)
RUID
EUID
SUID
RGID
EGID
SGID
Processus P
real user-id
effectiveuser-id
real group-id
effectivegroup-id
saved setuser-id
saved setgroup-id
Version septembre 2015 N°158
Protections de fichier et processus (2)
RUID
EUID
SUID
RGID
EGID
SGID
Processus P=Sauf si set-user-id
login + group(s)=sauf si set-group-id
Fichier de P
ou
ownergroup
Restaurer après« set/drop privilege »
OU: utilisation de :setuid, setgid (posix)setreuid, setregid…
Avoir les privilègesDifférents effets : cours sur les processus
Contrainte (si EUID != 0):new = RUID/SUID
69
Version septembre 2015 N°159
Appels systèmes et liens symboliques
Le fichier lien symbolique :
lchown, chown, lstat, readlink, unlink
remove, rename
Le fichier lui-même :
chmod, creat, chown, link, mkdir, open, stat
access, chdir, exec, mkfifo, opendir, pathconf,
truncate, rename
S’applique sur…
Version septembre 2015 N°160
Créer/Supprimer un répertoire (1)
S_ISGID : droits du gr. Du répertoire = droits de ses fichiers
S_ISVTX : création de fichiers ¬renommer & ¬supprimer
S_IX… : X est pour « traverser »
rmdir: le répertoire doit être vide
rmdir : fonctionne comme unlink
Nom du répertoire
droits
70
Version septembre 2015 N°161
Créer/supprimer un répertoire (2)
#include <sys/types.h> #include <sys/stat.h> int main () {
int e;... e = mkdir ("/tmp/myrep", S_IWUSR);e = rmdir ("/tmp/myrep");
}
Commande(s) associée(s): mkdir, rmdir, rm
Structure(s) interne(s): inode
Version septembre 2015 N°162
Ouvrir un répertoire
DIR : un peu comme FILE (section 3)
Curseur placé sur la 1ère entrée
Combien d’entrée minimum?
Nom du répertoire
71
Version septembre 2015 N°163
Parcourir un répertoire
Seul endroit où est stocké un nom de fichier
Avance le curseur
«descripteur»
N° inodeNom fichier
Et le chemin ?
Version septembre 2015 N°164
Réinitialiser/Fermer un répertoire
(*) Position sur la 1ère entrée (affecte table noyau)
(**) Affecte la TDF et les tables du noyau
(**) rend les ressources aux système
«descripteur»
(*)
(**)
72
Version septembre 2015 N°165
Réinitialiser/Fermer un répertoire
(*) Position sur la 1ère entrée (affecte table noyau)
(**) Affecte la TDF et les tables du noyau
(**) rend les ressources aux système
«descripteur»
(*)
(**)
Version septembre 2015 N°166
Accès au contenu d'un répertoire
#include <sys/types.h>#include <dirent.h>int main () {
DIR* dir;struct dirent * entry;dir = opendir ("/var"); entry = readdir (dir);printf ("%s - %d", entry->d_name, entry->d_ino);closedir(dir);
}
seekdir, telldir, ...
Commande(s) associée(s): ls, mv, …
Structure(s) interne(s): tables des fichiers
73
Version septembre 2015 N°167
Manipuler le répertoire courant (1)
Affecte le contenu d’un processus
Allocation de buf + taille allouée
«descripteur»
Nom de fichier
Chemin absolu
Version septembre 2015 N°168
Manipuler le répertoire courant (2)
#include <unistd.h>int main () {
int fd, e;... e = chdir ("/etc");/* autre possibilité */fd = open ("/etc", ...);e = fchdir (fd);
}
Table des fichiers: Changement nombre de références
Commande(s) associée(s): cd
Structure(s) interne(s): Tables des fichiers, processus
74
Version septembre 2015 N°169
Renommer / Déplacer un fichier
newpath dans le même système de fichiers
Autres liens en du non affectés
Si cible existe elle est écrasée
Nombreuses restrictions
Chemin correct, cible: répertoire non vide,…
Commande mv
Fichier d’arrivée
Fichier de départ
Version septembre 2015 N°170
Synchronisation Disque/buffer
sync: synchronise les buffers (écriture) et disques
fsync: idem mais pour un fichier
Différer l’écriture accélérer les échanges
Toutes les xx sec. + arrêt de la machine
Descripteur de fichier
75
Version septembre 2015 N°171
Synchronisation Disque/buffer
#include <unistd.h>
int main ()
{
int fd, e;
...
/* Ouverture fichier en écriture */
fd = open ("/etc/passwd", ...);
...
e = fsync (fd);
sync () /* S. F. */
}
Commande associée(s): sync
Structure(s) interne(s): Tables, buffer, inode
Version septembre 2015 N°181
Système de fichier /proc (1)
Processus en cours
Autres informations : mémoire, noyau, paramètres systèmes, …
76
Version septembre 2015 N°182
Système de fichier /proc (2)
Systèmes de fichierssupportés
Information sur la mémoire
Version septembre 2015 N°183
Système de fichier /proc (3)
Information sur la table des volumes montés