Estoy implementando tuberías en un sistema de archivos simulado en C++ (principalmente con C). Necesita ejecutar comandos en el shell del host pero realizar la propia tubería en el sistema de archivos simulado.¿Puede popen() hacer tubos bidireccionales como pipe() + fork()?
que podía lograr esto con los pipe()
, fork()
y system()
llamadas al sistema, pero prefiero usar popen()
(que se ocupa de la creación de una tubería, un proceso que se bifurcan, y pasando un comando de la cáscara). Esto puede no ser posible porque (creo) necesito poder escribir desde el proceso principal de la tubería, leer en el extremo del proceso secundario, escribir la salida desde el elemento secundario y, finalmente, leer esa salida del elemento primario. La página de manual para popen()
en mi sistema dice que es posible un conducto bidireccional, pero mi código debe ejecutarse en un sistema con una versión anterior que solo soporte tubos unidireccionales.
Con las llamadas separadas anteriores, puedo abrir/cerrar tuberías para lograr esto. ¿Es posible con popen()
?
Para un ejemplo trivial, para ejecutar ls -l | grep .txt | grep cmds
necesito:
- abierto de una tubería y el proceso para ejecutar
ls -l
en el host; leer su salida trasera - canalizar la salida del
ls -l
de nuevo a mi simulador de - Abrir un tubo y el proceso para ejecutar
grep .txt
en el host en la salida del hilo dels -l
- Pipe la salida de esta vuelta al simulador (pegado aquí)
- Abrir un tubo y el proceso para ejecutar
grep cmds
en el host en la salida del hilogrep .txt
- pipe la salida de esta vuelta al simulador e imprimirlo
hombre Popen
desde Mac OS X:
La función
popen()
'abre' un proceso mediante la creación de una tubería bidireccional, se bifurcan, e invocando la cáscara. Cualquier secuencia abierta porpopen()
llamadas anteriores en el proceso principal están cerradas en el nuevo proceso hijo. Históricamente,popen()
se implementó con una tubería unidireccional; por lo tanto, muchas implementaciones depopen()
solo permiten que el argumento mode especifique lectura o escritura, no ambas. Comopopen()
ahora se implementa utilizando un conducto bidireccional , el argumento de modo puede solicitar un flujo de datos bidireccional. El argumento modo es un puntero a una cadena terminada en cero que debe ser 'r' para lectura, 'w' para escritura o 'r +' para lectura y escritura.
ignorar esta mala manual, que está haciendo que parezca que unidireccionalidad de las tuberías es un comportamiento heredado. El comportamiento de su implementación no es estándar y es probable que nunca sea compatible con otros entornos. Simplemente configure las tuberías y el tenedor y ejecútese, y todo estará feliz. –
Todo este hilo está hecho de win, todas las respuestas y la pregunta merecen +1. –
Acabo de hacer ** man popen ** en Ubuntu 13.04 y dice: 'Dado que un conducto es por definición unidireccional, el argumento tipo puede especificar solo lectura o escritura, no ambos; la secuencia resultante es correspondientemente de solo lectura o de solo escritura. "Estoy sorprendido de que este sea el popen más antiguo ... – sager89