Может ли popen () создавать двунаправленные каналы, такие как pipe () + fork ()?

Я реализую конвейерную систему в смоделированной файловой системе на 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 +' для чтения и письма.

19
задан Taylor Edmiston 4 May 2011 в 19:58
поделиться