В чем именно разница между трубами и потоками?

В чем именно разница между трубами и потоками?

Я читал о трубах и потоках, но все еще не понимаю, как это реализовано.

Программа запускается и считывает данные из потока «стандартного ввода» (stdin), куда клавиатура отправляет данные.

Мой вопрос: чем это отличается от конвейера? Конвейер позволяет мне иметь процесс, который отправляет данные в конвейер, а другой процесс считывает данные из него.

При нажатии клавиши клавиатуры данные отправляются на stdin, и программа считывает данные из этого же потока.

Операция «чтения» выполняется сразу после отправки данных в этот поток, как в канале.

Являются ли эти ручьи водопроводными?

решение1

Терминальный ввод-вывод Unix традиционно реализовывался как своего родаочередь. Старые ядра использовали clists. V8 Unix использовалпотоки. В большинстве случаев списки и потоки используются для реализации части связи между пользовательским процессом (в частности, файловым дескриптором) и драйвером символьного устройства (например, последовательным портом или pty).

Каналы также являются очередью, но они связывают пользовательские процессы (в частности, пару файловых дескрипторов). Существует множество реализаций каналов, включая сокеты; специальный тип файла; и даже STREAMS (STREAMS является производным от потоков V8.)

Итак, потоки и каналы являются реализациями очереди, но они используются в разных ситуациях.

решение2

Это может быть не совсем точно с технической точки зрения, но может помочь вам разобраться в ситуации. Я склонен думать о потоке как о чем-то внутреннем для программы, таком как STDIN, STDOUT и STDERR, тогда как канал является внешним по отношению к программе. Например, в команде cat foo.txt | grep barкоманда catотправляет данные на свой внутренний STDOUT, затем внешний канал подключает его к grepвнутреннему STDIN.

Связанный контент