Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Entrelazar flujos stdout de un proceso con stdin de otro proceso

Estas en el tema de Entrelazar flujos stdout de un proceso con stdin de otro proceso en el foro de C/C++ en Foros del Web. Necesito saber la forma más correcta de hacer que el flujo o stream de entrada (stdin) sea la salida de otro proceso en Windows. Digamos ...
  #1 (permalink)  
Antiguo 15/12/2012, 19:31
Avatar de dontexplain  
Fecha de Ingreso: junio-2012
Mensajes: 536
Antigüedad: 11 años, 9 meses
Puntos: 127
Entrelazar flujos stdout de un proceso con stdin de otro proceso

Necesito saber la forma más correcta de hacer que el flujo o stream de entrada (stdin) sea la salida de otro proceso en Windows.

Digamos que tengo nodejs.exe corriendo y myapp.exe corriendo. Myapp.exe está en espera mediante (cin) para una entrada; cual es la forma más correcta de enviar un flujo desde nodejs.exe a myapp.exe. Nodejs permite enviar flujo de salida simplemente con console.log

He pensado que quizás pudieran servirme los operandos de redirección como

nodejs.exe < myapp.exe

(obviando stderr y demás)

No obstante, esto cómo podría revertirse al estado inicial. Pensé en pipes.

¿Qué piensan?

Muchas gracias.
__________________
21añero.
HTML/CSS, PHP, JS/jQuery, Mysql; NodeJS/Socket.io (& V8); C++ ; Python (wxpy); Ensamblador.
Músico (clarinetista/pianista) y compositor

Última edición por dontexplain; 15/12/2012 a las 19:37
  #2 (permalink)  
Antiguo 16/12/2012, 06:57
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 7 meses
Puntos: 83
Respuesta: Entrelazar flujos stdout de un proceso con stdin de otro proceso

Abres tu el proceso? Si es asi puedes redireccionar los handles de entrada - salida - error a traves de la struct de informacion de inicio de proceso

Código:
STARTUPINFO si;
SECURITY_ATTRIBUTES sap, sat;

//atributos de seguridad del hilo de ejecucion nulos
sap.nLength = sizeof(SECURITY_ATTRIBUTES);
sap.lpSecurityDescriptor = NULL;
sap.bInheritHandle = 1;

//atributos de seguridad del proceso nulos
sat.nLength = sizeof(SECURITY_ATTRIBUTES);
sat.lpSecurityDescriptor = NULL;
sat.bInheritHandle = 1;

//informacion de inicio
memset(&si, 0, sizeof(si));
si.cb = sizeof(si);
si.dwFlags = STARTF_USESTDHANDLES;//para que acepte los handles de redireccion
si.hStdInput = STDIN;           //estas tres lineas son las que te interesan
si.hStdOutput = STDOUT;
si.hStdError = STDERR;

if(!CreateProcess(ruta, cmdl_args, &sap, &sat, 1, 0, NULL, NULL, &si, &pi))) {
    ...
}
Las tres ultimas lineas del startupinfo son las que definen los handles que usará la aplicacion lanzada, y en este ejemplo solo los he reafirmado (es solo un ejemplo para ver de que va).

Inicias myapp.exe, abres archivos o lo que sea para la redireccion y desde ahi lanzas nodejs.exe con los manejadores redireccionados.

Esto se usa, por ejemplo, en servidores web: recibes una peticion de .php, llamas al interprete de php redireccionando la stdout y stderr a un archivo vacio generado al momento, php escribe en stdout que previamente ha sido redireccionado a un manejador de archivo por que que en verdad escribe sobre el archivo, cuando finaliza el servidor envia el archivo generado.

No te será necesario restablecer las redirecciones porque estaran 'encerradas' en el ambito de ese proceso.

Aqui http://msdn.microsoft.com/en-us/library/ms682499.aspx tienes tambien un manual de msdn para redireccionar manualmente los anejadores de entrada - salida con pipes.

Saludos
vosk

Etiquetas: proceso
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:01.