Tengo un programa (servidor) que se encarga de ejecutar otro programa (cliente), usando fork+exec, y pretendo que tengan una comunicación bidireccional usando dos pipe's UNIX de toda la vida. Pretendo que la entrada estandar de uno sea la salida estandar del otro y viceversa. Necesito dos tubos: uno cli2srv y otro srv2cli.
El problema que tengo es que ambos procesos se me quedan bloqueados a la espera, justo en el fgets (lo he comprobado a base de printfs), a pesar de que el servidor que deberia iniciar la conversación ya ha enviado su primer printf. Para comunicarlos, uso printf y fgets(...,...,stdin). No se lo que puede fallar. Os pego el código que considero conflictivo
if(fork()) { // Pare (Server)
dup2(cli2srv[0], STDIN_FILENO);
dup2(srv2cli[1], STDOUT_FILENO);
close(cli2srv[0]);
close(cli2srv[1]);
close(srv2cli[0]);
close(srv2cli[1]);
} else { // Fill (Client)
dup2(cli2srv[1], STDOUT_FILENO);
dup2(srv2cli[0], STDIN_FILENO);
close(cli2srv[0]);
close(cli2srv[1]);
close(srv2cli[0]);
close(srv2cli[1]);
fprintf(stderr, "Server exec: %s\n", exec);
execvp(exec, NULL);
perror("execvp");
}
// El server inicia la comunicación y espera el cliente
fprintf(stdout, "Semilla:\n");
fprintf(stderr, "hola\n");
fgets(comanda, COMBUF, stdin);
El cliente se limita a un while(1) y fgets/printfs. Por supuesto se queda atascado en el primer fgets.
¿Alguien sabe que es lo que me estoy dejando? Debe ser una tonteria pero no hay forma de dar con ella. Si necesitais más código en concreto decidlo.
Saludos y gracias por adelantado ^^
Edito: Ya lo he resuelto (llevaba unas cuantas horitas, no creais), se arregla con un
fflush(stdout);
Yo no se las horas que me ha quitado de mi vida esta función... ¬¬