Cómo enviar datos a través de STDIN desde el proceso padre al proceso bisnieto (PIPES/FORK)
Tengo 4 procesos. Parent -> Proceso A (hijo de parent) -> Proceso B (hijo de proceso A) -> Proceso C (hijo de proceso B). Parent obtiene stdin
del usuario, lo analiza y lo envía como argumentos al hijo Proceso A y ejecuta un programa en c++ utilizando execv
. Luego, proceso A utiliza esos argumentos y emite algo a stdout
. Usando pipes
y dup2
, proceso A envía la salida a stdin
de un script en python
que se ejecuta en el Proceso B. Finalmente, la salida de stdout
del proceso B es stdin
de otro programa en c++ en el Proceso C.
Ahora bien, el programa que se ejecuta en Proceso C también necesita recibir entrada stdin
(como cuando el usuario la escribe en la terminal). Sin embargo, no puedo enviar esos comandos al Proceso C desde el proceso padre. El comando de entrada simplemente entra en el proceso padre, y el padre básicamente envía lo que analiza correctamente al proceso A a través del pipe.
El proceso padre obtiene la entrada de stdin
de esta manera y analiza la cadena y la envía al hijo:
//proceso padre
Parser P;
while (!std::cin.eof()) {
std::string line;
std::getline(std::cin, line);
arguments = P.BeginParsing(line);
if (arguments.size() > 0) {
for (int k = 0; k < 4; k++) {
finalArguments[k] = arguments[k];
}
close(fd[0]);
write(fd[1],finalArguments,4*sizeof(int));
close(fd[1]);
}
}
¿Cómo enviamos datos desde la entrada estándar del proceso padre hasta el bisnieto básicamente, mientras que el bisnieto obtiene la entrada de stdin
de su padre? Cualquier ayuda sería apreciada.
davy.ai
Para enviar datos del stdin del Padre al bisnieto y permitir que el bisnieto reciba stdin de su padre, necesitamos crear tuberías adicionales entre los procesos.
Primero, necesitamos modificar el código en el Proceso C para leer desde una tubería como entrada del stdin en lugar de directamente desde la terminal del usuario. Esto se puede hacer utilizando un setup similar de tubería y dup2 a lo que hicimos en el Proceso A:
Luego, necesitamos crear una tercera tubería para la comunicación entre el proceso Padre y el Proceso C. Podemos modificar el código en el proceso Padre para usar esta nueva tubería para enviar entrada directamente al Proceso C:
Finalmente, necesitamos modificar el código en el Proceso B para leer desde la tubería hacia el Proceso C como entrada del stdin en lugar de directamente desde el Proceso A. Podemos utilizar otro setup de tubería y dup2 para lograr esto:
Con estas modificaciones, el proceso Padre puede enviar entrada tanto al Proceso A como al Proceso C, permitiendo que el Proceso C reciba entrada de su padre.