Esto parece ser una cosa bastante común de hacer, y he logrado enseñarme todo lo que necesito para que funcione, excepto que ahora tengo un solo problema, que está desafiando mi solución de problemas.C fork/exec con tubería sin bloqueo IO
int nonBlockingPOpen(char *const argv[]){
int inpipe;
pid_t pid;
/* open both ends of pipe nonblockingly */
pid = fork();
switch(pid){
case 0: /*child*/
sleep(1); /*child should open after parent has open for reading*/
/*redirect stdout to opened pipe*/
int outpipe = open("./fifo", O_WRONLY);
/*SHOULD BLOCK UNTIL MAIN PROCESS OPENS FOR WRITING*/
dup2(outpipe, 1);
fcntl(1, F_SETFL, fcntl(1, F_GETFL) | O_NONBLOCK);
printf("HELLO WORLD I AM A CHILD PROCESS\n");
/*This seems to be written to the pipe immediately, blocking or not.*/
execvp(*argv, argv);
/*All output from this program, which outputs "one" sleeps for 1 second
*outputs "two" sleeps for a second, etc, is captured only after the
*exec'd program exits!
*/
break;
default: /*parent*/
inpipe = open("./fifo", O_RDONLY | O_NONBLOCK);
sleep(2);
/*no need to do anything special here*/
break;
}
return inpipe;
}
¿Por qué el proceso secundario no escribirá su stdout en la tubería cada vez que se genere una línea? ¿Hay algo que me falta en la forma en que funcionan execvp o dup2? Soy consciente de que mi enfoque de todo esto es un poco extraño, pero no puedo encontrar otra forma de capturar la salida de los binarios de código cerrado programáticamente.
acabo de encontrar http://homepage.ntlworld.com/jonathan.deboynepollard/FGA/dont-set-shared-file-descriptors-to-non-blocking-mode.html esta página, lo que indica que no debería intentar pasar un proceso secundario a un descriptor que no sea de bloqueo, pero ninguno de los motivos enumerados * parece * aplicarse a lo que estoy haciendo. Me doy cuenta de que el programa que estoy ejecutando probablemente fallaría si el proceso de escucha se desconectara de la tubería (generando EAGAIN en el niño), pero eso no me molesta. – conartist6