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