Я реализую трубопровод на смоделированной файловой системе в C++ (в основном с C). Он должен запускать команды в оболочке хоста, но выполнять сам трубопровод в имитируемой файловой системе.Может ли popen() создавать двунаправленные трубы, такие как pipe() + fork()?
я мог бы добиться этого с системными вызовами pipe()
, fork()
и system()
, но я бы предпочел использовать popen()
(который обрабатывает создание трубы, порождая процесс, и передавая команду оболочки). Это может быть невозможно, потому что (я думаю) мне нужно иметь возможность писать из родительского процесса в трубе, читать на конце дочернего процесса, записывать выходные данные из дочернего элемента и, наконец, читать этот вывод из родителя. Страница man для popen()
в моей системе говорит, что возможна двунаправленная трубка, но мой код должен работать в системе со старой версией, поддерживающей только однонаправленные каналы.
С отдельными вызовами, приведенными выше, я могу открыть/закрыть трубы, чтобы добиться этого. Возможно ли это с popen()
?
Для простого примера, чтобы запустить ls -l | grep .txt | grep cmds
мне нужно:
- Открыть трубы и процесс, чтобы запустить
ls -l
на хосте; прочитать его выход обратно - трубы на выходе
ls -l
назад к моему тренажеру - Открыть трубу и процесс запуска
grep .txt
на хосте на централизованном выходеls -l
- Pipe выхода этого обратно в тренажер (застрял здесь)
- Открыть трубы и процесс запуска
grep cmds
на хосте на централизованном выходеgrep .txt
- Pipe выхода этого обратно в тренажер и распечатать его
человек POPEN
С Mac OS X:
popen()
функция 'открывает' а процесс создания двунаправленного трубы, разветвление и вызова оболочки. Любые потоки, открытые предыдущимиpopen()
, вызовы в родительском процессе закрыты в новом дочернем процессе. Исторически было выполненоpopen()
с однонаправленной трубой; следовательно, многие реализацииpopen()
только позволяют аргументу mode указывать чтение или запись, а не оба. Посколькуpopen()
теперь реализован с использованием двунаправленной трубы , аргумент режима может запросить двунаправленный поток данных. Аргумент mode является указателем на строку с нулевым символом , которая должна быть 'r' для чтения, 'w' для записи, или 'r +' для чтения и записи.
Игнорируйте это плохое руководство, которое делает его, кажется, как однонаправленность труб является наследством поведение. Поведение вашей реализации нестандартно и вряд ли когда-либо будет поддерживаться в других средах. Просто установите трубы и вилку и выполните сами, и все будут счастливы. –
Вся эта тема сделана из победы, все ответы и вопрос заслуживают +1. –
Я только что сделал ** man popen ** на Ubuntu 13.04, и он гласит: 'Поскольку канал по определению однонаправленный, аргумент типа может указывать только чтение или запись, а не оба; результирующий поток соответственно только для чтения или только для записи. «Я удивлен, что это« более старый »popen ... – sager89