Entrées-sorties§

Systèmes d’exploitation

auteur:Pierre-Antoine Champin
adresse:Département Informatique - IUT - Lyon1
licence:Ce travail est sous license Creative Commons Attribution-ShareAlike 3.0 France
1

Introduction§

2

Rappel sur les apports d’UNIX§

Homogénéité:

3

Notion de fichier§

4

Descripteur de fichier§

Un descripteur de fichier est un entier qui identifie, au sein d’un processus, un fichier ouvert par ce processus.

/* open retourne un descripteur de fichier... */
int open (const char *path, int oflag, [int mode]);
/* ... utilisé ensuite par les fonctions d'E/S */
int read (int fildes, void *buf, int nbyte);
int write(int fildes, void *buf, int nbyte);
int lseek(int fildes, int offset, int whence);
int close(int fildes);
5

Informations liées à un DF§

Le système fait correspondre à chaque DF une structure de donnée contenant les informations sur le fichier ouvert :

  • type de ressource d’E/S (stockage, périphérique…)
  • mode d’ouverture (lecture, ajout, écriture)
  • adresse et taille du tampon, le cas échéant
  • etc…
6

Illustration§

_images/es_filedescriptors.png
7

Remarques§

La structure de données contenant les informations sur le fichier ouvert

8

Remarque (suites)§

La structure de données contenant les informations sur le fichier ouvert

9

Types de ressources d’E/S§

10

Fichier « classique »§

Gérés par le système de fichiers.

char buf[10];
int fd = open("fich1.dat", O_RDONLY);
read(fd, buf, 10);
close(fd);
fd = open("fich2.dat", O_WRONLY);
write(fd, buf, 10);
close(fd);
11

Périphériques Flux§

int souris = open("/dev/input/mice", O_RDONLY);
int carte_son = open("/dev/dsp", O_WRONLY);
12

Périphériques Adressables§

int dd = open("/dev/sda1", O_RDWR);
lseek(dd, 10, SEEK_SET);
read(dd, buf, 1);

NB : dans cet exemple, on accède directement au périphérique (sans passer par le système de fichiers)

13

Périphériques spéciaux§

14

Tube – Pipe§

ls -l | grep pchampin
15

Illustration§

_images/es_pipe.png
16

Remarques§

Le tube peut être

→ pour communiquer entre un père et ses enfants

→ pour communiquer entre enfants d’un même père

17

Communication père-fils§

int p[2];
pipe(p);
int pid = fork();
if (pid > 0)       write(p[1], data, data_len);
else if (pid == 0) read(p[0], data, data_len);
18

Socket§

19

Descripteurs de fichiers standards§

20

Principe§

21

Redirection des E/S standard§

prog1 <fich1 >fich2

ou

prog1 | prog2 | prog3
22

Redirection par programme§

Appel système dup2: duplique un descripteur de fichier

fd = obtenir_descripteur(); // open, pipe...
dup2(fd, 1);
close(fd);
execl("prog1", "prog1");

NB: on peut en principe rediriger n’importe quel descripteur de fichier, mais dans ce cas la réutilisabilité est limitée.

23

Alternatives et optimisation§

24

Entrées / sorties asynchrones§

25

L’appel système mmap§

26