¿Cuál es exactamente la diferencia entre tuberías y flujos?

Leí sobre pipes y streams y todavía estoy confundido sobre cómo se implementa.

Se inicia un progtwig y lee datos de la stream de "input estándar" (stdin), que es donde el keyboard envía datos.

Mi pregunta es, ¿cómo es eso diferente de una tubería? Piping me permite tener un process que envía datos a una tubería, y otro process está leyendo datos de la misma.

Cuando se presiona el keyboard, los datos se envían a stdin y un progtwig está leyendo datos de esta misma transmisión.

Una operación de "lectura" se ejecuta tan pronto como los datos se envían a esta secuencia, al igual que una tubería.

¿Se canalizan estas streams?

La terminal I / O de Unix se ha implementado tradicionalmente como una especie de queue . Los núcleos más viejos utilizan clists. V8 Unix usó transmisiones . En la mayoría de los casos, los clics y las transmisiones se utilizan para implementar una parte del enlace entre un process de usuario (específicamente, un descriptor de file) y un controller de dispositivo de caracteres (por ejemplo, un serial port o pty).

Las tuberías también son una queue, pero vinculan processs de usuario (específicamente, un par de descriptores de files). Hay una variedad de implementaciones de tuberías, incluidos sockets; un tipo especial de file; e incluso STREAMS (STREAMS) es un derivado de las transmisiones V8.

Entonces, las secuencias y las tuberías son implementaciones de una queue, pero se usan en diferentes situaciones.

Esto puede no ser completamente preciso desde una perspectiva técnica, pero puede ayudar a su confusión. Tiendo a pensar en un flujo como algo intrínseco al progtwig, como STDIN, STDOUT y STDERR, mientras que un conducto es externo al progtwig. Por ejemplo, en el command cat foo.txt | grep bar cat foo.txt | grep bar , el command cat envía a su STDOUT intrínseco, el conducto externo lo conecta al STDIN intrínseco de grep .