GNU/Linux >> Tutoriales Linux >  >> Linux

¿El Propósito De Usar Un Fifo Vs Un Archivo Temporal O Una Tubería?

Desde APUE

Los FIFO se pueden usar para duplicar un flujo de salida en una serie de comandos
de shell
. Esto evita que se escriban los datos en un disco intermedio
archivo
(similar al uso de canalizaciones para evitar archivos de disco intermedios).

Pero mientras que las tuberías solo se pueden usar para conexiones lineales
entre procesos, un FIFO tiene un nombre, por lo que se puede usar para
conexiones no lineales .

Considere un procedimiento que necesita procesar un flujo de entrada
filtrado dos veces.

mkfifo fifo1
prog3 < fifo1 &
prog1 < infile | tee fifo1 | prog2

Creamos el FIFO y luego iniciamos prog3 en segundo plano, leyendo
del FIFO. Luego iniciamos prog1 y usamos tee para enviar su entrada
tanto a FIFO como a prog2.

  1. ¿Cómo un FIFO "duplica un flujo de salida en una serie de comandos de shell"? ¿No es esto hecho por tee? en lugar de un FIFO?

  2. En el ejemplo, mkfifo fifo1 crea un archivo en el directorio actual y fifo1 parece reemplazable con un archivo normal. Entonces, ¿cuál es el punto de un FIFO para "evitar escribir los datos en un archivo de disco intermedio"?

  3. ¿Qué significan “conexiones lineales” y “conexiones no lineales” entre procesos? ¿Qué significa que un FIFO se puede usar para conexiones no lineales, mientras que una tubería solo se puede usar para conexiones lineales entre procesos?

Gracias.

Respuesta aceptada:

  1. APUE dice que "FIFO pueden usarse para duplicar un flujo de salida”, no dice que los FIFO realmente dupliquen el flujo de salida. Como señalas, la duplicación la realiza tee en el ejemplo.

  2. mkfifo crea un FIFO, que es visible como un "archivo" en el directorio contenedor; pero escribir en FIFO no es como escribir en un archivo porque los datos nunca llegan al disco. Las canalizaciones, con nombre o no, no proporcionan almacenamiento de datos, proporcionan canales de comunicación; el extremo de escritura de una tubería no puede escribir datos si no hay un receptor, la tubería simplemente transmite datos, sin almacenarlos. (En la mayoría de los sistemas, las tuberías son respaldado por pequeños búferes del núcleo, para mejorar el rendimiento, pero eso es un detalle de implementación).

  3. Las conexiones lineales entre procesos son tuberías que se pueden representar como un gráfico lineal. En el ejemplo, puede representar la última línea como

    infile → prog1 → tee fifo1 → prog3
    

    que es lineal, pero si intenta representar toda la cadena, reduciendo a elementos de procesamiento, necesita

    infile → prog1 → prog2
                   → prog3
    

    que no es lineal (hay un nodo en el gráfico, prog1 , que tiene dos nodos de salida).

Relacionado:¿Cómo crear una nueva ventana en el directorio actual en tmux?
Linux
  1. Uso de Google Drive desde la línea de comandos de Linux

  2. 4 herramientas para descargar cualquier archivo usando la línea de comandos en Linux

  3. ¿Cuál es el propósito del archivo .bashrc en Linux?

  4. ¿Cuál es la diferencia de redirigir una salida usando >, &>, >&y 2&>?

  5. ¿Cómo leer la penúltima línea en un archivo usando Bash?

Uso del archivo de configuración SSH

Cómo extraer el archivo tar.gz en Linux usando la línea de comandos

Cómo monitorear el progreso de los datos a través de una tubería usando el comando 'pv'

Crear archivos usando la línea de comando en Linux

¿Cómo escribo stderr en un archivo mientras uso tee con una tubería?

Descargar un archivo con wget usando múltiples conexiones