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.

  1. Notions
  2. Questions
  3. Ranger et relier
  4. 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 read sur 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. EAGAIN n'apparaît qu'en mode non bloquant, et SIGPIPE frappe 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, read bloque 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 et p[1] écrit. Les deux sont ouverts dans le processus appelant : c'est fork qui permet ensuite de les partager avec un fils.

  • Un programme lance ls | wc -l avec pipe, fork, dup2 et exec. ls se termine mais wc reste 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

    wc lit 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 faire close(p[1]) après le fork. Si ls s'est terminé, le tube ne peut pas être plein.