2010-04-26 7 views
5

OK Tengo un programa que crea dos tubos -> horquillas -> stdin y stdout del niño se redirigen a un extremo de cada tubería -> el padre está conectado a los otros extremos de las tuberías e intenta leer la secuencia asociada con la salida del niño e imprimirlo en la pantalla (y también lo escribiré en la entrada del niño).no se puede leer de la secuencia hasta que el niño sale?

El problema es que cuando el padre trata de encontrar el flujo de salida del hijo, simplemente se detiene y espera hasta que el niño muera para generar un error y luego imprime el resultado. Si el niño no sale, simplemente espera por siempre. Que esta pasando? Pensé que tal vez los fgets se bloquearían hasta que ALGO estuviese en la transmisión, pero no bloquear todo el camino hasta que el niño abandone sus descriptores de archivos.

Aquí está el código:

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
#include <sys/types.h> 
#include <unistd.h> 

int main(int argc, char *argv[]) { 
FILE* fpin; 
FILE* fpout; 
int input_fd[2]; 
int output_fd[2]; 
pid_t pid; 
int status; 
char input[100]; 
char output[100]; 
char *args[] = {"/somepath/someprogram", NULL}; 
fgets(input, 100, stdin); // the user inputs the program name to exec 

pipe(input_fd); 
pipe(output_fd); 
pid = fork(); 

if (pid == 0) { 
    close(input_fd[1]); 
    close(output_fd[0]); 
    dup2(input_fd[0], 0); 
    dup2(output_fd[1], 1); 
    input[strlen(input)-1] = '\0'; 
    execvp(input, args); 
} 
else { 
    close(input_fd[0]); 
    close(output_fd[1]); 
    fpin = fdopen(input_fd[1], "w"); 
    fpout = fdopen(output_fd[0], "r"); 
    while(!feof(fpout)) { 
    fgets(output, 100, fpout); 
    printf("output: %s\n", output); 
    } 
} 

return 0; 
} 

Respuesta

5

El niño debe, probablemente, fflush() su salida, y/o terminar líneas correctamente. De lo contrario, el almacenamiento en búfer de E/S puede conservar los datos durante bastante tiempo.

Puede intentar establecer el indicador O_NONBLOCK (usando fcntl()) en el descriptor de archivo de salida del hijo antes de entregar el control, pero eso requerirá que cambie sus códigos principales en consecuencia. Sin embargo, como se señaló en los comentarios, esto no lo ayudará a superar el almacenamiento en búfer hecho en el nivel de biblioteca estándar C si el niño usa FILE-I/O basado en.

+0

Hmmm, tienes razón. Cuando desenfoco la salida, funciona. El problema es que no tengo forma de controlar al niño. Solo puedo controlarlo con mi programa de prueba ya que puedo editar el código fuente ... ¿Cómo me aseguro de que cualquier programa que esté ejecutado tenga su salida enrojecida o sin búfer o algo así ... arghhh – BobTurbo

+0

Espera, aquí está el código del niño de prueba: printf ("Introducir entrada: \ n"); fflush (stdout); si saco el/n o el fflush, retrasa ... Lo necesito para leerlo sin tener un/ny ... sin que me limpie. – BobTurbo

+0

Probablemente no debería estar usando fgets ... pero no estoy seguro de que resuelva el problema. – BobTurbo

Cuestiones relacionadas