He estado leyendo sobre cómo se implementan las canalizaciones en el kernel de Linux y quería validar mi comprensión. Si soy incorrecto, se seleccionará la respuesta con la explicación correcta.
- Linux tiene un VFS llamado pipefs que está montado en el kernel (no en el espacio del usuario)
- pipefs tiene un súper bloque único y está montado en su propia raíz (
pipe:
), junto a/
- pipefs no se puede ver directamente a diferencia de la mayoría de los sistemas de archivos
- La entrada a pipefs es a través de
pipe(2)
syscall - La
pipe(2)
llamada al sistema utilizada por los shells para canalizar con el|
operador (o manualmente desde cualquier otro proceso) crea un nuevo archivo en pipefs que se comporta más o menos como un archivo normal - El archivo en el lado izquierdo del operador de tubería se
stdout
redirige al archivo temporal creado en pipefs - El archivo en el lado derecho del operador de tubería tiene su
stdin
conjunto en el archivo en pipefs - pipefs se almacena en la memoria y, a través de la magia del kernel, no se debe paginar
¿Es esta explicación de cómo funcionan las tuberías (p ls -la | less
. Ej. ) Bastante correcta?
Una cosa que no entiendo es cómo algo como bash establecería un proceso ' stdin
o stdout
al descriptor de archivo devuelto por pipe(2)
. Todavía no he podido encontrar nada al respecto.
Sí, me refiero específicamente a las operaciones de nivel inferior, con la suposición de que el
—
Brandon Wamboldt
|
operador solo está llamando pipe(2)
como un proceso como lo hace bash.
Consulte también ¿Cuál es la diferencia entre "Redirección" y "Tubería"?
—
Sergiy Kolodyazhnyy
pipe()
llamada del kernel junto con la maquinaria que lo soporta (pipefs
, etc.) es de un nivel mucho más bajo que el|
operador ofrecido en su shell. Este último generalmente se implementa utilizando el primero, pero no tiene que ser así.