
Я читал о трубах и потоках, но все еще не понимаю, как это реализовано.
Программа запускается и считывает данные из потока «стандартного ввода» (stdin), куда клавиатура отправляет данные.
Мой вопрос: чем это отличается от конвейера? Конвейер позволяет мне иметь процесс, который отправляет данные в конвейер, а другой процесс считывает данные из него.
При нажатии клавиши клавиатуры данные отправляются на stdin, и программа считывает данные из этого же потока.
Операция «чтения» выполняется сразу после отправки данных в этот поток, как в канале.
Являются ли эти ручьи водопроводными?
решение1
Терминальный ввод-вывод Unix традиционно реализовывался как своего родаочередь. Старые ядра использовали clists. V8 Unix использовалпотоки. В большинстве случаев списки и потоки используются для реализации части связи между пользовательским процессом (в частности, файловым дескриптором) и драйвером символьного устройства (например, последовательным портом или pty).
Каналы также являются очередью, но они связывают пользовательские процессы (в частности, пару файловых дескрипторов). Существует множество реализаций каналов, включая сокеты; специальный тип файла; и даже STREAMS (STREAMS является производным от потоков V8.)
Итак, потоки и каналы являются реализациями очереди, но они используются в разных ситуациях.
решение2
Это может быть не совсем точно с технической точки зрения, но может помочь вам разобраться в ситуации. Я склонен думать о потоке как о чем-то внутреннем для программы, таком как STDIN, STDOUT и STDERR, тогда как канал является внешним по отношению к программе. Например, в команде cat foo.txt | grep bar
команда cat
отправляет данные на свой внутренний STDOUT, затем внешний канал подключает его к grep
внутреннему STDIN.