77
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

Programmation système & Réseauxdeptinfo.unice.fr/~lahire/enseignement/SYSL3/miage/... · 1 Programmation système & Réseaux Philippe Lahire Université de Nice Sophia-Antipolis

  • 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

77

Version septembre 2015 N°184

Variables environnement

Système de fichier /proc (4)

Répertoire courantExécutable

Répertoire Racine

Propriétaire, PID