Les tubes
Le tube créé par pipe et ses deux descripteurs, son héritage par fork, la fin de fichier et SIGPIPE, la capacité et le blocage, dup2 pour brancher l'entrée ou la sortie standard, et le tube nommé créé par mkfifo.
- 29 cartes
- 4 thèmes
- Gratuit
Le programme, thème par thème
Le poids de chaque thème suit celui que lui donne l'examen.
- Notions
- Questions
- Ranger et relier
- Mises en situation
Quelques cartes du deck
Tube (pipe) : de quoi s'agit-il ?
Voir la réponse
Canal à sens unique géré par le noyau : ce qu'un processus écrit à une extrémité, un autre le lit à l'autre extrémité, dans le même ordre.
C'est un flux d'octets sans frontières entre messages. Il vit dans le noyau et disparaît quand tous les descripteurs qui le désignent sont fermés. Dans
ls | wc -l, le shell en crée un entre les deux commandes.Un tube est vide et un processus en détient encore l'extrémité d'écriture ouverte. Que fait
readsur l'extrémité de lecture ?- Il bloque jusqu'à l'arrivée de données ou jusqu'à la fermeture de tous les écrivains
- Il rend 0 aussitôt, comme à la fin d'un fichier
- Il rend -1 avec l'erreur EAGAIN et le processus continue
- Il envoie SIGPIPE au lecteur, qui est alors terminé
Voir la réponse
Il bloque jusqu'à l'arrivée de données ou jusqu'à la fermeture de tous les écrivains
Rendre 0 est réservé au cas où plus aucun écrivain n'existe.
EAGAINn'apparaît qu'en mode non bloquant, etSIGPIPEfrappe l'écrivain, jamais le lecteur.Sur un tube, read rend 0, c'est-à-dire la …, quand le tube est vide et que tous les descripteurs d'… sont fermés.
Voir la réponse
Sur un tube, read rend 0, c'est-à-dire la fin de fichier, quand le tube est vide et que tous les descripteurs d'écriture sont fermés.
Tant qu'un seul descripteur d'écriture reste ouvert, même dans un autre processus,
readbloque au lieu de rendre 0 : un lecteur ne peut pas savoir si l'écrivain va encore écrire.pipe(int p[2]) : de quoi s'agit-il ?
Voir la réponse
Appel système qui crée un canal du noyau et range dans le tableau deux descripteurs : le premier pour lire, le second pour écrire.
Après
pipe(p),p[0]lit etp[1]écrit. Les deux sont ouverts dans le processus appelant : c'estforkqui permet ensuite de les partager avec un fils.Un programme lance
ls | wc -lavec pipe, fork, dup2 et exec.lsse termine maiswcreste bloqué à jamais. Quelle est la cause probable ?- Le tube est plein et ls est resté bloqué en écriture
- wc a reçu SIGPIPE et attend maintenant un signal de plus
- Le père a gardé p[1] ouvert : wc ne voit jamais la fin de fichier
- dup2 a fermé p[0] dans le père, donc wc ne peut plus lire
Voir la réponse
Le père a gardé p[1] ouvert : wc ne voit jamais la fin de fichier
wclit jusqu'à la fin de fichier, qui n'arrive que si tous les descripteurs d'écriture sont fermés. Le père en détient un : il doit faireclose(p[1])après lefork. Silss'est terminé, le tube ne peut pas être plein.