O popen () pode criar tubos bidirecionais como pipe () + fork ()?

Estou implementando a tubulação em um sistema de arquivos simulado em C ++ (principalmente em C). Ele precisa executar comandos no shell do host, mas executar a tubulação em si no sistema de arquivos simulado.

Eu poderia conseguir isso com opipe(), fork()esystem() chamadas de sistema, mas eu preferiria usarpopen() (que lida com a criação de um pipe, bifurcando um processo e passando um comando para o shell). Isso pode não ser possível porque (acho) preciso ser capaz de escrever a partir do processo pai do pipe, ler no final do processo filho, gravar a saída do filho e finalmente ler essa saída do pai. A página de manual parapopen() no meu sistema diz que um canal bidirecional é possível, mas meu código precisa ser executado em um sistema com uma versão mais antiga que suporta apenas canais unidirecionais.

Com as chamadas separadas acima, posso abrir / fechar tubos para conseguir isso. Isso é possível compopen()?

Para um exemplo trivial, para executarls -l | grep .txt | grep cmds Eu preciso:

Abra um tubo e processe para executarls -l no host; leia sua saída de voltaCanalize a saída dels -l de volta ao meu simuladorAbra um tubo e processe para executargrep .txt no host na saída canalizada dels -lCanalize a saída disso de volta para o simulador (preso aqui)Abra um tubo e processe para executargrep cmds no host na saída canalizada degrep .txtCanalize a saída disso de volta para o simulador e imprima-a

homem popen

No Mac OS X:

opopen() A função 'abre' um processo criando um tubo bidirecional, bifurcando e chamando o shell. Quaisquer fluxos abertos por anteriorpopen() as chamadas no processo pai são fechadas no novo processo filho. Historicamente,popen() foi implementado com um tubo unidirecional; portanto, muitas implementações depopen() permite apenas que o argumento mode especifique leitura ou gravação, não os dois. Porquepopen() agora é implementado usando um canal bidirecional, o argumento mode pode solicitar um fluxo de dados bidirecional. O argumento mode é um ponteiro para uma sequência terminada em nulo que deve ser 'r' para leitura, 'w' para gravação ou 'r +' para leitura e gravação.

questionAnswers(4)

yourAnswerToTheQuestion