¿Puede popen () hacer tuberías bidireccionales como pipe () + fork ()?

Estoy implementando tuberías en un sistema de archivos simulado en C ++ (con principalmente C). Necesita ejecutar comandos en el shell del host pero realizar la tubería en el sistema de archivos simulado.

Podría lograr esto con elpipe(), fork()ysystem() llamadas al sistema, pero preferiría usarpopen() (que se encarga de crear una tubería, bifurcar un proceso y pasar un comando al shell). Esto puede no ser posible porque (creo) necesito poder escribir desde el proceso padre de la tubería, leer en el final del proceso hijo, escribir la salida del niño y finalmente leer esa salida del padre. La página del manual parapopen() en mi sistema dice que es posible una tubería bidireccional, pero mi código debe ejecutarse en un sistema con una versión anterior que solo sea compatible con tuberías unidireccionales.

Con las llamadas separadas anteriores, puedo abrir / cerrar tuberías para lograr esto. ¿Es eso posible conpopen()?

Para un ejemplo trivial, para ejecutarls -l | grep .txt | grep cmds Necesito:

Abra una tubería y procese para ejecutarls -l en el anfitrión; leer su salida de nuevoCanalizar la salida dels -l de vuelta a mi simuladorAbra una tubería y procese para ejecutargrep .txt en el host en la salida canalizada dels -lCanalice la salida de esto al simulador (atascado aquí)Abra una tubería y procese para ejecutargrep cmds en el host en la salida canalizada degrep .txtCanalice la salida de este al simulador e imprímalo

hombre popen

Desde Mac OS X:

lospopen() La función 'abre' un proceso creando una tubería bidireccional, bifurcando e invocando el shell. Cualquier transmisión abierta por anteriorpopen() las llamadas en el proceso primario se cierran en el nuevo proceso secundario. Históricamente,popen() se implementó con una tubería unidireccional; por lo tanto, muchas implementaciones depopen() solo permita que el argumento de modo especifique lectura o escritura, no ambos. Porquepopen() ahora se implementa utilizando una tubería bidireccional, el argumento de modo puede solicitar un flujo de datos bidireccional. El argumento de modo es un puntero a una cadena terminada en nulo que debe ser 'r' para leer, 'w' para escribir o 'r +' para leer y escribir.

Respuestas a la pregunta(4)

Su respuesta a la pregunta