Acerca de su pregunta de rendimiento, las canalizaciones son más eficientes que los archivos porque no se necesita disco IO. Por cmd1 | cmd2
lo tanto, es más eficiente que cmd1 > tmpfile; cmd2 < tmpfile
(esto podría no ser cierto si tmpfile
está respaldado en un disco RAM u otro dispositivo de memoria como tubería con nombre; pero si es una tubería con nombre, cmd1
debe ejecutarse en segundo plano ya que su salida puede bloquearse si la tubería se llena ) Si necesita el resultado cmd1
y aún necesita enviar su salida cmd2
, debe cmd1 | tee tmpfile | cmd2
permitir cmd1
y cmd2
ejecutar en paralelo evitando las operaciones de lectura de disco cmd2
.
Las canalizaciones con nombre son útiles si muchos procesos leen / escriben en la misma canalización. También pueden ser útiles cuando un programa no está diseñado para usar stdin / stdout para su IO que necesita usar archivos . Puse los archivos en cursiva porque las canalizaciones con nombre no son exactamente archivos en un punto de vista de almacenamiento, ya que residen en la memoria y tienen un tamaño de búfer fijo, incluso si tienen una entrada del sistema de archivos (para fines de referencia). Otras cosas en UNIX tienen entradas del sistema de archivos sin ser archivos: solo piense en /dev/null
u otras entradas en /dev
o /proc
.
Como las tuberías (con y sin nombre) tienen un tamaño de búfer fijo, las operaciones de lectura / escritura pueden bloquearse, lo que hace que el proceso de lectura / escritura pase al estado IOWait. Además, ¿cuándo recibe un EOF cuando lee desde un búfer de memoria? Las reglas sobre este comportamiento están bien definidas y se pueden encontrar en el hombre.
Una cosa que no puede hacer con las tuberías (con nombre y sin nombre) es buscar de nuevo en los datos. Como se implementan utilizando un búfer de memoria, esto es comprensible.
Sobre "everything in Linux/Unix is a file"
, no estoy de acuerdo. Las canalizaciones con nombre tienen entradas del sistema de archivos, pero no son exactamente archivos. Las canalizaciones sin nombre no tienen entradas del sistema de archivos (excepto tal vez en /proc
). Sin embargo, la mayoría de las operaciones de E / S en UNIX se realizan mediante la función de lectura / escritura que necesita un descriptor de archivo , incluida la tubería (y el socket) sin nombre. No creo que podamos decir eso "everything in Linux/Unix is a file"
, pero seguramente podemos decir eso "most IO in Linux/Unix is done using a file descriptor"
.