c - ubuntu mp3 tag editor




Как работает труба в Linux? (3)

Как работает трубопровод? Если я запустил программу через CLI и перенаправил вывод в файл, я смогу передать этот файл в другую программу по мере ее написания?

В основном, когда одна строка записывается в файл, я хотел бы, чтобы она была немедленно передана в мое второе приложение (я пытаюсь динамически рисовать график из существующей программы). Просто не уверен, завершает ли трубопровод первую команду, прежде чем перейти к следующей команде.

Любая обратная связь будет принята с благодарностью!


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

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

$ mknod /tmp/named-pipe p

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

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


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


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

  • Он голоден для ввода.

  • Он произвел значительно больший объем продукции, чем его преемник готов к употреблению.

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

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

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





pipe