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