Все оболочки Unix (которые я знаю) реализуют конвейеры оболочки через что-то другое, чем pty
(как правило, они используют каналы Unix! -); следовательно, библиотека времени выполнения C / C ++ в cpp_program
ЗНАЕТ, что ее вывод НЕ является терминалом, и, следовательно, она будет буферизовать вывод (кусками по несколько КБ за раз). Если вы не напишите свою собственную оболочку (или semiquasimaybeshelloid), которая реализует конвейеры с помощью pyt, я считаю, что нет способа сделать то, что вам нужно, используя конвейерную нотацию.
Рассматриваемая вещь "шеллоид" может быть написана на Python (или на C, или на Tcl, или ...) с использованием модуля pty
стандартной библиотеки или высокоуровневой абстракции на ее основе, такой как pexpect , и тот факт, что две программы, которые должны быть соединены через "конвейер на основе pty", написаны на C ++ и Python, довольно не имеет значения. Ключевая идея состоит в том, чтобы обмануть программу слева от канала и заставить ее поверить, что ее стандартный вывод является терминалом (поэтому pty должен быть в корне этого трюка), чтобы обмануть свою библиотеку времени выполнения в НЕ буферизировать вывод. После того, как вы написали такой шеллоид, вы бы назвали его с некоторым синтаксисом, таким как:
$ shelloid 'cpp_program | python_program.py '
Конечно, было бы проще обеспечить «точечное решение», написав python_program
в знании, что он должен порождать cpp_program
как подпроцесс И обманом заставить его поверить, что его стандартный вывод является терминалом (т. Е. * Например, 1013 * будет напрямую использовать pexpect
). Но если у вас миллион таких ситуаций, когда вы хотите отменить обычную буферизацию, выполняемую предоставляемой системой библиотекой времени выполнения C, или во многих случаях, когда вы хотите повторно использовать существующие фильтры и т. Д., На самом деле предпочтительным может быть написание shelloid
.