Может ли 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 +» для чтения и записи.

Ответы на вопрос(5)

Ваш ответ на вопрос