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:
ls -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 -l
Canalize 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 .txt
Canalize a saída disso de volta para o simulador e imprima-ahomem 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.