
Eu li sobre pipes e streams e ainda estou confuso sobre como isso é implementado.
Um programa é iniciado e lê os dados do fluxo de “entrada padrão” (stdin), para onde o teclado envia os dados.
Minha pergunta é: como isso é diferente de um cachimbo? A tubulação me permite ter um processo que envia dados para um canal e outro processo lê dados dele.
Quando o teclado é pressionado, os dados são enviados para stdin e um programa lê os dados desse mesmo fluxo.
Uma operação de “leitura” é executada assim que os dados são enviados para este fluxo, assim como um pipe.
Esses fluxos são canalizados?
Responder1
A E/S do terminal Unix tem sido tradicionalmente implementada como uma espécie defila. Kernels mais antigos usavam clists. V8 Unix usadofluxos. Na maioria dos casos, clists e streams são usados para implementar uma parte do link entre um processo de usuário (especificamente, um descritor de arquivo) e um driver de dispositivo de caractere (por exemplo, uma porta serial ou um pty).
Pipes também são uma fila, mas vinculam processos de usuário (especificamente, um par de descritores de arquivo). Há uma variedade de implementações de tubos, incluindo soquetes; um tipo especial de arquivo; e até mesmo STREAMS (STREAMS é um derivado dos streams V8).
Portanto, streams e pipes são implementações de uma fila, mas são usados em situações diferentes.
Responder2
Isso pode não ser totalmente preciso do ponto de vista técnico, mas pode ajudar na sua confusão. Costumo pensar em um stream como algo intrínseco ao programa, como STDIN, STDOUT e STDERR, enquanto um pipe é externo ao programa. Por exemplo, no comando cat foo.txt | grep bar
, o cat
comando envia para seu STDOUT intrínseco, o canal externo o conecta ao grep
STDIN intrínseco de.