chapitre 5: tubes - unice.frdeptinfo.unice.fr/~lahire/enseignement/sysl3/miage/annee-2015-20… ·...

13
1 Chapitre 5: Tubes Version septembre 2015 N°260 Principales caractéristiques Communication synchrone Unidirectionnel Limitations: Taille, sérialisation, ... Mécanismes: voir cours systèmes de fichiers Intra-machine Volatiles ou persistants (FIFO ou tube nommé) Implémentation du shell: >, <, | Bidirectionnel : Syst. V R.4 implantation par les sockets sur linux

Upload: others

Post on 24-Sep-2020

4 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Chapitre 5: Tubes - unice.frdeptinfo.unice.fr/~lahire/enseignement/SYSL3/miage/Annee-2015-20… · Inode Infos … 2 pipe anonyme Espace utilisateur ... fermer « fd[1] » si processus

1

Chapitre 5: Tubes

Version septembre 2015 N°260

Principales caractéristiques

Communication synchrone

Unidirectionnel

Limitations: Taille, sérialisation, ...

Mécanismes: voir cours systèmes de fichiers

Intra-machine

Volatiles ou persistants (FIFO ou tube nommé)

Implémentation du shell: >, <, |

Bidirectionnel :

Syst. V R.4

implantation par les sockets sur linux

Page 2: Chapitre 5: Tubes - unice.frdeptinfo.unice.fr/~lahire/enseignement/SYSL3/miage/Annee-2015-20… · Inode Infos … 2 pipe anonyme Espace utilisateur ... fermer « fd[1] » si processus

2

Version septembre 2015 N°261

pipe: tube de communication

Descripteurs en lecture et écriture

Création d’un tube Disparait si plus aucun processus ne peut l’utiliser Utilisable par la descendance (exclusivement) fork execve

Paramètre résultat utilisable directement avec write read …

Version septembre 2015 N°262

main(){…

}0

1

2

PID: 5301

fd[0]fd[1]

#include <unistd.h>int main () {

int fd[2];int err;char *s1, *s2;s1 = "chaine1";s2 = (char *) malloc (10);err = pipe (fd);write (fd[1], s1, 8);read (fd[0], s2, 8);

... }

fd[0]fd[1]

Sens du flux

pipe: avec un processus (1)

Page 3: Chapitre 5: Tubes - unice.frdeptinfo.unice.fr/~lahire/enseignement/SYSL3/miage/Annee-2015-20… · Inode Infos … 2 pipe anonyme Espace utilisateur ... fermer « fd[1] » si processus

3

Version septembre 2015 N°263

Pro

cess

us

0

12

345

pipe: avec un processus (1)

Table fichiers Table inodes…

État :Nombre :

O_RDONLY

État :Nombre : O_WRONLY

1

N° inode :Nb. copies :Offset 1Offset 0Inode Infos …

2

pipe anonyme

Espace utilisateur

1pipe[0]

0 9

blocs

Version septembre 2015 N°264

pipe : entre deux processus (1)

Le fils « hérite » des descripteurs du père les deux processus : lecteur et/ou écrivain Echange : un seul sens mais n’importe lequel

Page 4: Chapitre 5: Tubes - unice.frdeptinfo.unice.fr/~lahire/enseignement/SYSL3/miage/Annee-2015-20… · Inode Infos … 2 pipe anonyme Espace utilisateur ... fermer « fd[1] » si processus

4

Version septembre 2015 N°265

pipe : entre deux processus (2)

Fermeture d’une des extrémités dans chaque processus Un seul « écrivain » et un seul « lecteur » Choix arbitraire d’un sens « père » vers « fils »

Version septembre 2015 N°266

pipe : entre deux processus (3)

#include <unistd.h>int main () {

int fd[2], pid;char *s1, *s2;int err;... s1 = "chaine1";err = pipe (fd);if ( (pid = fork ()) < 0) erreur;if (pid == 0) { /* Traitement fils */

s2 = (char *) malloc (10);close (fd[1]);read (fd[0], s2, 8);}

else { /* Traitement père */ close (fd[0]);write (fd[1], s1, 8);}

... }

?

Page 5: Chapitre 5: Tubes - unice.frdeptinfo.unice.fr/~lahire/enseignement/SYSL3/miage/Annee-2015-20… · Inode Infos … 2 pipe anonyme Espace utilisateur ... fermer « fd[1] » si processus

5

Version septembre 2015 N°267

main(){…

}0

1

2

PID: 5302

main(){…

}0

1

2

PID: 5301

fd[0]fd[1]

fd[0]fd[1]

5301 5302

pipe : entre deux processus (4)

Sens du flux

fd[0]fd[1]

Version septembre 2015 N°268

Pro

cess

us

père

0

12

345

pipe : entre deux processus (5)

Table fichiers Table inodesEspace utilisateur

État :Nombre :

O_RDONLY

État :Nombre : O_WRONLY

1

N° inode :Nb. copies :Offset 0Offset 1Inode Infos …

2

pipe anonyme

1pipe[0]

Pro

cess

us

fils 0

12

345

2

2

écrivain

lecteur

Page 6: Chapitre 5: Tubes - unice.frdeptinfo.unice.fr/~lahire/enseignement/SYSL3/miage/Annee-2015-20… · Inode Infos … 2 pipe anonyme Espace utilisateur ... fermer « fd[1] » si processus

6

Version septembre 2015 N°269

pipe : entre trois processus (1)

Version septembre 2015 N°270

pipe : entre trois processus (2)

Fermeture d’une des extrémités dans chaque processus Un seul « écrivain » : le père et deux « lecteurs » : les fils Toute combinaison est possible

Page 7: Chapitre 5: Tubes - unice.frdeptinfo.unice.fr/~lahire/enseignement/SYSL3/miage/Annee-2015-20… · Inode Infos … 2 pipe anonyme Espace utilisateur ... fermer « fd[1] » si processus

7

Version septembre 2015 N°271

pipe: compléments (1)

Informations complémentaires

Utilisation de blocs directs

Structure FIFO (premier écrit, premier lu)

Gestion d'une file circulaire

Position de déplacement: dans l'inode

Fichier ordinaire: dans la table des fichiers

Lecture (non) bloquante: no_delay

Cas limites

Tube vide ou sans « écrivains » : lecture EOF

read retourne 0 - sinon si rien à lire: blocage

fermer « fd[1] » si processus pas « écrivain »

Tube sans « lecteurs » : écriture signal SIGPIPE

Version septembre 2015 N°272

pipe: compléments (2)

Echange par flots ou messages (programmation)

En général si « message » : lecture/écriture atomique

Ecriture :

interruptible Ecriture non atomique

Atomique : nb octets à écrire < capacité tube

Voir fpathconf

Attente possible si pas assez de place

Lecture :

les octets lus sont retirés du tube

aucune garantie d’atomicité ou complétude

Tester le nb octets lu et itérer

Page 8: Chapitre 5: Tubes - unice.frdeptinfo.unice.fr/~lahire/enseignement/SYSL3/miage/Annee-2015-20… · Inode Infos … 2 pipe anonyme Espace utilisateur ... fermer « fd[1] » si processus

8

Version septembre 2015 N°273

PèreStdin 0 Stdout 1

Stderr 2

Fils gaucheStdin 0 Stdout 1

Stderr 2

Fils droite

Stdin 0 Stdout 1

Stderr 2

fork()

exec() exec()

pipe/dup: exemple du pipe shell (1)

bash

ls -l wc -l

Version septembre 2015 N°274

pipe/dup: exemple du pipe shell (2)

#include <unistd.h>

int main () {int pid, nfd; int tab[2];... /* analyse commande */ if ( (pid = fork ()) == 0) { /* (début 1) */

... /* Traitement redirection */ ... if (/* mise en tube */) { /* (début 2) */

pipe (tab); if ( (pid = fork ()) == 0) {

/* partie gauche pipe: stdout --> tube */ close (stdout); nfd = dup (tab[1]); /* nfd = stdout */close (tab[1]); close (tab[0]); execlp(gauche, ...); }

Page 9: Chapitre 5: Tubes - unice.frdeptinfo.unice.fr/~lahire/enseignement/SYSL3/miage/Annee-2015-20… · Inode Infos … 2 pipe anonyme Espace utilisateur ... fermer « fd[1] » si processus

9

Version septembre 2015 N°275

pipe/dup: exemple du pipe shell (3)

#include <unistd.h>

int main () {/* début sur T. précédent */

if (/* mise en tube */) { /* (suite 2) */ /* partie droite pipe: stdin --> tube */ close (stdin);nfd = dup (tab[0]); /* nfd = stdin */ close (tab[0]); close (tab[1]);

} /* fin 2 */ /* suite 1 */ execve(droit, ...);

} /* fin 1 */ if (/* & */) wait (&status);

}

Version septembre 2015 N°276

Pro

cess

us

fils 0

12

345

pipe/dup: exemple du pipe shell (4)

Table fichiers Table inodesEspace utilisateur

État :Nombre :

O_RDONLY

État :Nombre : O_WRONLY

2

N° inode :Nb. copies :Offset 0Offset 1Inode Infos …

2

pipe anonyme

2pipe[0]

Pro

cess

us

fils 0

12

345

3

3

écrivain

lecteur

Processus père non apparent

Page 10: Chapitre 5: Tubes - unice.frdeptinfo.unice.fr/~lahire/enseignement/SYSL3/miage/Annee-2015-20… · Inode Infos … 2 pipe anonyme Espace utilisateur ... fermer « fd[1] » si processus

10

Version septembre 2015 N°277

Tube nommé: Principaux aspects

Points commun avec « pipe »

Unidirectionnel

Toujours intra-machine

Toujours FIFO

différence avec « pipe » : l’accès

Un fichier avec un nom

Partage par tout processus (aussi ¬ descendant)

Moment de création des processus communicants

Version septembre 2015 N°278

Tube nommé: exemple d’utilisation (1)

1ère mise en œuvre

Page 11: Chapitre 5: Tubes - unice.frdeptinfo.unice.fr/~lahire/enseignement/SYSL3/miage/Annee-2015-20… · Inode Infos … 2 pipe anonyme Espace utilisateur ... fermer « fd[1] » si processus

11

Version septembre 2015 N°279

Tube nommé: exemple d’utilisation (2)

2ème mise en œuvre

Version septembre 2015 N°280

mkfifo: tube nommé

Création d’un tube nommé (FIFO) Masque de protection: mode & ¬ umask Utilisation appels systèmes pour fichier ordinaire Exemple : dup2, read, write, fcntl, etc.Mais pas lseek Fréquent: création du tube avec mkfifo(1) mis en œuvre avec mkfifo(2)

Nom fichier

Protection

Page 12: Chapitre 5: Tubes - unice.frdeptinfo.unice.fr/~lahire/enseignement/SYSL3/miage/Annee-2015-20… · Inode Infos … 2 pipe anonyme Espace utilisateur ... fermer « fd[1] » si processus

12

Version septembre 2015 N°281

Utilisation d’un tube nommé

open :

une ouverture en mode O_WRONLY (resp. O_RDONLY) est bloquante jusqu’à ce qu’un autre processus ouvre le même FIFO en lecture (resp. écriture).

Si l’ouverture est en mode O_RDWR ou si l’option est O_NONBLOCK, alors l’ouverture est non bloquante.

l’ouverture d’un FIFO peut provoquer un « rendez-vous » entre 2 processus !

write et read : même comportement que pour un tube anonyme

Version septembre 2015 N°282

Fichier fifo.h:#include type.h stat.h errno.h extern in errno; #define FIFO1 "/tmp/fifo.1" #define FIFO2 "/tmp/fifo.2"#define PERMS 0666

Fichier client:#include "fifo.h" int main () {

int readfd, writefd;if ( (writefd = open (FIFO1, 1)) < 0) erreur;if ( (readfd = open (FIFO2, 0)) < 0) erreur;client (readfd, writefd); close (readfd); close (writefd);

}

Tube nommé: Exemple d'utilisation

client Serveur

/tmp/fifo.1

/tmp/fifo.2

Page 13: Chapitre 5: Tubes - unice.frdeptinfo.unice.fr/~lahire/enseignement/SYSL3/miage/Annee-2015-20… · Inode Infos … 2 pipe anonyme Espace utilisateur ... fermer « fd[1] » si processus

13

Version septembre 2015 N°283

Tube nommé: Exemple d'utilisation

Fichier serveur:#include "fifo.h" int main () {

int readfd, writefd;if ( (mkfifo (FIFO1, PERMS)) < 0

&& (errno != EEXIST)) unlink + erreur; if ( (mkfifo (FIFO2, PERMS)) < 0

&& (errno != EEXIST)) erreur; if ( (writefd = open (FIFO1, 1)) < 0) erreur;if ( (readfd = open (FIFO2, 0)) < 0) erreur;server (readfd, writefd); close (readfd); close (writefd);if (unlink (FIFO1) < 0) erreur;if (unlink (FIFO2) < 0) erreur;

}