Hola chicos! Mirad tengo un problema...
Estoy haciendo un pequeño programa en c para la comunicacion entre pipes, pero no me funciona como yo quiero.
El funcionamiento del programa deveria ser el siguiente:
1. llamar al archivo ejecutable con un fichero
2.Despues para cada linea del fichero este programa debe llamar a un proceso hijo, y despues realizar la transferencia de datos mediante un pipe, posteriormente el hijo debe imprimir por pantalla los datos.
Me lee bien el fichero y los datos, pero en la conexion solo me envia correctamente los primeros datos del archivo, es decir la primera linea.. creo que es por abrir y cerrar los pipes de una manera o otra.. pero no tengo ni idea la verdad... podriais ayudarme??
Fichero a leer:
07 01 09 11 2011 08 30 General
02 05 10 11 2011 08 45 Especialista
01 01 11 11 2011 08 30 General
04 08 12 11 2011 08 30 Especialista
06 10 14 11 2011 08 30 General
Mi codigo:
Código:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main(int argc, char* argv[])
{
//===============================================//
//===============Variables=======================//
int fd[2], nbytes;
pid_t childpid;
char mensaje[80];
char readbuffer[80];
int codDentista,codPaciente,dia,mes,any,hora,minuto;//Variables para el padre
char esp[20];
int cD,d,m,a,h;//Variables para los pipes
FILE *ventas;
//===============================================//
pipe(fd);
ventas=fopen(argv[1],"r");//abrimos el archivo en modo lectura
if(ventas==NULL){
printf("Error al abrir el archivo");
}
else{
while((fscanf(ventas, "%d %d %d %d %d %d %d %s", &codDentista, &codPaciente, &dia, &mes, &any, &hora, &minuto, esp))!=EOF)
{
printf("Tipo:%s\n\n",esp);
if((childpid = fork()) == -1)
{
perror("fork");
exit(1);
}
if(childpid != 0)
{
close(fd[0]);//Cerramos la entrada del pipe,
sprintf( mensaje, "%d %d %d %d %d %d", codDentista, dia, mes, any, hora, minuto);
printf("Mensaje a enviar:%s\n\n",mensaje);
write(fd[1], mensaje, (strlen(mensaje)+1));
close(fd[1]);
wait();
}
else
{
wait();
close(fd[1]);
nbytes = read(fd[0], readbuffer, sizeof(readbuffer));
sscanf(readbuffer,"%d %d %d %d %d %d", &cD, &d, &m, &a, &h, &m);
printf("Codigo del Dentista: %d\n",cD);
printf("Dia: %d\n",d);
printf("Mes: %d\n",m);
printf("Any: %d\n",a);
printf("Hora: %d\n",h);
printf("Minuto: %d\n",m);
//printf("Missatge Rebut: %s\n", readbuffer);
close(fd[0]);
printf("\n siguiente dentista...\n\n");
exit(0);
}
}
fclose (ventas);
}
return(0);
}
Terminal de linux:
Tipo:General
Mensaje a enviar:7 9 11 2011 8 30
Codigo del Dentista: 7
Dia: 9
Mes: 30
Any: 2011
Hora: 8
Minuto: 30
siguiente dentista...
Tipo:Especialista
Mensaje a enviar:2 10 11 2011 8 45
Codigo del Dentista: 32674
Dia: -933811569
Mes: 32674
Any: 0
Hora: 0
Minuto: 32674
siguiente dentista...
Tipo:General
Mensaje a enviar:1 11 11 2011 8 30
Codigo del Dentista: 32674
Dia: -933811569
Mes: 32674
Any: 0
Hora: 0
Minuto: 32674
siguiente dentista...
Tipo:Especialista
Mensaje a enviar:4 12 11 2011 8 30
Codigo del Dentista: 32674
Dia: -933811569
Mes: 32674
Any: 0
Hora: 0
Minuto: 32674
siguiente dentista...
Tipo:General
Mensaje a enviar:6 14 11 2011 8 30
Codigo del Dentista: 32674
Dia: -933811569
Mes: 32674
Any: 0
Hora: 0
Minuto: 32674
Gracias!
Editado -- Sab Ene 07, 2012 7:17 am --Si le quitas todos los close del pipe lo hacen todos pero.. la variable mes no la envia bien... no se porque..