Как делает трубопровод в Linux?

Не жесткая технология, но я действительно наслаждаюсь Выпитый и Ликвидированный . Это похоже, Вы говорите со своим приятелем программиста, смешанным в с жизненным материалом.

30
задан codeforester 1 October 2017 в 18:09
поделиться

4 ответа

Если ваши программы обмениваются данными с помощью stdin и stdout , убедитесь, что вы вызываете fflush (stdout) после того, как вы напишете или найдете способ отключить стандартную буферизацию ввода-вывода. Лучший справочник, который я могу придумать, действительно описывающий, как лучше всего реализовать конвейеры на C / C ++, - это Расширенное программирование в среде UNIX или Сетевое программирование UNIX: Том 2 . Вы могли бы, вероятно, начать с и этой статьи . ​​

9
ответ дан 27 November 2019 в 23:09
поделиться

Если ваши две программы настаивают на чтении и записи в файлы и не используют stdin / stdout, вы можете использовать именованный канал вместо файла.

Создайте именованный канал с помощью команды mknod (1):

$ mknod /tmp/named-pipe p

Затем настройте свои программы для чтения и записи в / tmp / named-pipe (используйте любой путь / имя, которое вы считаете подходящим).

В этом случае , обе программы будут работать параллельно, блокируя при необходимости, когда канал становится полным / пустым, как описано в других ответах.

3
ответ дан 27 November 2019 в 23:09
поделиться

Если вы хотите перенаправить вывод одной программы на ввод другой, просто используйте простой конвейер:

program1 arg arg | program2 arg arg

Если вы хотите сохранить вывод program1 в файл и направьте его в program2 , вы можете использовать tee (1) :

program1 arg arg | tee output-file | program2 arg arg

Все программы в конвейере выполняются одновременно. Большинство программ обычно используют блокировку ввода-вывода: если, когда они пытаются прочитать свой ввод, но там ничего нет, они блокируют : то есть они останавливаются, и операционная система отменяет расписание их запускать до тех пор, пока не станет доступным больше входных данных (чтобы не перегружать ЦП). Точно так же, если программа, находящаяся на более раннем этапе конвейера, записывает данные быстрее, чем более поздняя программа может их прочитать, в конечном итоге буфер канала заполняется, и модуль записи блокируется: ОС отменяет планирование этого канала до тех пор, пока канал не '

56
ответ дан 27 November 2019 в 23:09
поделиться

Конвейер не завершает первую команду до выполнения второй . Канал Unix (и Linux) запускает все команды одновременно. Команда будет приостановлена, если

  • ей не хватает ввода.

  • Она произвела значительно больше выходных данных, чем ее преемник готов принять.

Для большинства программ вывод буферизирован , что означает что ОС накапливает значительный объем вывода (возможно, около 8000 символов) перед передачей его следующему этапу конвейера. Эта буферизация используется, чтобы избежать слишком большого количества переключений между процессами и ядром.

Если вы хотите, чтобы вывод по конвейеру отправлялся сразу, вы можете использовать небуферизованный ввод / вывод, что в C означает вызов чего-то вроде fflush () , чтобы быть уверенным, что любой буферизованный вывод немедленно отправляется следующему процессу. Небуферизованный ввод также возможен, но, как правило, в нем нет необходимости, потому что процесс, которому не хватает ввода, обычно не ждет полного буфера, но будет обрабатывать любой ввод, который вы можете получить.

Для типичных приложений небуферизованный вывод не рекомендуется; вы обычно получаете лучшую производительность с настройками по умолчанию. Однако в вашем случае, когда вы хотите выполнить динамическое построение графиков сразу же, у первого процесса есть доступная информация, вы определенно захотите использовать небуферизованный вывод. Если вы используете C, будет достаточно вызова fflush (stdout) всякий раз, когда вы хотите отправить вывод.

Небуферизованный ввод также возможен, но, как правило, в нем нет необходимости, потому что процесс, которому не хватает ввода, обычно не ждет полного буфера, но будет обрабатывать любой ввод, который вы можете получить.

Для типичных приложений небуферизованный вывод не рекомендуется; вы обычно получаете лучшую производительность с настройками по умолчанию. Однако в вашем случае, когда вы хотите выполнить динамическое построение графиков сразу же, у первого процесса есть доступная информация, вы определенно захотите использовать небуферизованный вывод. Если вы используете C, будет достаточно вызова fflush (stdout) всякий раз, когда вы хотите отправить вывод.

Небуферизованный ввод также возможен, но, как правило, в нем нет необходимости, потому что процесс, которому не хватает ввода, обычно не ждет полного буфера, но будет обрабатывать любой ввод, который вы можете получить.

Для типичных приложений небуферизованный вывод не рекомендуется; вы обычно получаете лучшую производительность с настройками по умолчанию. Однако в вашем случае, когда вы хотите выполнить динамическое построение графиков сразу же, у первого процесса есть доступная информация, вы определенно захотите использовать небуферизованный вывод. Если вы используете C, будет достаточно вызова fflush (stdout) всякий раз, когда вы хотите отправить вывод.

вы обычно получаете лучшую производительность с настройками по умолчанию. Однако в вашем случае, когда вы хотите выполнить динамическое построение графиков сразу же, у первого процесса есть доступная информация, вы определенно захотите использовать небуферизованный вывод. Если вы используете C, будет достаточно вызова fflush (stdout) всякий раз, когда вы хотите отправить вывод.

вы обычно получаете лучшую производительность с настройками по умолчанию. Однако в вашем случае, когда вы хотите выполнить динамическое построение графиков сразу же, у первого процесса есть доступная информация, вы определенно захотите использовать небуферизованный вывод. Если вы используете C, будет достаточно вызова fflush (stdout) всякий раз, когда вы хотите отправить вывод.

26
ответ дан 27 November 2019 в 23:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: