En cierto modo, la canalización funciona así: primero ejecuta el primer comando y luego el segundo comando en su caso.
Es decir, seamos A|B
el comando dado. Entonces es incierto si A
o B
comienza primero. Pueden comenzar exactamente al mismo tiempo si hay varias CPU. Una tubería puede contener una cantidad de datos indefinida pero finita.
Si B intenta leer desde la tubería, pero no hay datos disponibles, B
esperará hasta que lleguen los datos. Si B
estaba leyendo desde un disco, B
podría tener el mismo problema y necesitar esperar hasta que termine la lectura de un disco. Una analogía más cercana sería leer desde un teclado. Allí, B
tendría que esperar a que un usuario escriba. Pero en todos estos casos, B ha comenzado una operación de "lectura" y debe esperar hasta que termine. Pero si B
es un comando de tal manera que solo necesita una salida parcial, SIGPIPE matará A
después de cierto punto donde B
se alcanza el nivel de entrada de s.A
Si A
intenta escribir en la tubería y la tubería está llena, A
debe esperar a que quede espacio libre en la tubería. A
podría tener el mismo problema si estuviera escribiendo en una terminal. Una terminal tiene control de flujo y puede moderar el ritmo de los datos. En cualquier caso, a A
, ha comenzado una operación de "escritura" y esperará hasta que finalice la operación de escritura.
A
y B
se comportan como coprocesos, aunque no todos los coprocesos se comunicarán con una tubería. Ninguno de los dos tiene el control total del otro.
-m
argumento.