Entrées-sorties§
Systèmes d’exploitation
auteur: | Pierre-Antoine Champin |
---|---|
adresse: | Département Informatique - IUT - Lyon1 |
licence: | ![]() |
Systèmes d’exploitation
auteur: | Pierre-Antoine Champin |
---|---|
adresse: | Département Informatique - IUT - Lyon1 |
licence: | ![]() |
/dev
pour les périphériques ou devices).Homogénéité:
read
, write
, open
, close
, lseek
)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);
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…
La structure de données contenant les informations sur le fichier ouvert
La structure de données contenant les informations sur le fichier ouvert
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);
int souris = open("/dev/input/mice", O_RDONLY);
int carte_son = open("/dev/dsp", O_WRONLY);
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)
/dev/zero
: périphérique de taille non bornée ne contenant que des zéros (“\x0”, pas le chiffre “0”)/dev/random
: périphérique de taille non bornée contenant des valeurs aléatoires (et non reproductibles)/dev/null
: périphérique dans lequel on peut toujours écrire (les données écrites sont perdues)/dev/full
: périphérique toujours plein (toute tentative d’écriture se solde par une erreur)ls -l | grep pchampin
Le tube peut être
soit matérialisé dans le système de fichier (mknod
)
NB: simplement pour le nommer, toujours pas de stockage
soit transmis directement par un parent à son/ses enfants
→ pour communiquer entre un père et ses enfants
→ pour communiquer entre enfants d’un même père
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);
read
, write
recv
, send
, recvfrom
, sendto
…prog1 <fich1 >fich2
ou
prog1 | prog2 | prog3
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.
read
et write
sont dits bloquants :
le processus passe dans l’état bloqué jusqu’à l’aboutissement de l’opération.aio_read
et aio_write
.mmap
§