J'ai lu comment les canaux sont implémentés dans le noyau Linux et je voulais valider ma compréhension. Si je me trompe, la réponse avec l'explication correcte sera sélectionnée.
- Linux a un VFS appelé pipefs qui est monté dans le noyau (pas dans l'espace utilisateur)
- pipefs a un seul super bloc et est monté à sa propre racine (
pipe:), à côté de/ - les pipefs ne peuvent pas être visualisés directement contrairement à la plupart des systèmes de fichiers
- L'entrée dans pipefs se fait via le
pipe(2)syscall - L'
pipe(2)appel système utilisé par les shells pour la tuyauterie avec l'|opérateur (ou manuellement à partir de tout autre processus) crée un nouveau fichier dans pipefs qui se comporte à peu près comme un fichier normal - Le fichier sur le côté gauche de l'opérateur de tuyau est
stdoutredirigé vers le fichier temporaire créé dans pipefs - Le fichier sur le côté droit de l'opérateur de tuyau a son
stdinjeu dans le fichier sur les pipefs - pipefs est stocké en mémoire et grâce à la magie du noyau, ne doit pas être paginé
Cette explication du fonctionnement des tuyaux (par exemple ls -la | less) est-elle à peu près correcte?
Une chose que je ne comprends pas, c'est comment quelque chose comme bash définirait un processus ' stdinou stdoutle descripteur de fichier renvoyé par pipe(2). Je n'ai encore rien trouvé à ce sujet.
|opérateur appelle simplement pipe(2)comme un processus comme le fait bash.
pipe()appel du noyau avec la machinerie qui le prend en charge (pipefs, etc.) est de niveau beaucoup plus bas que l'|opérateur proposé dans votre shell. Ce dernier est généralement implémenté en utilisant le premier, mais ce n'est pas obligatoire.