Reglamento general de los foros   •   FAQ   •   Buscar en el foro •  Registrarse | Iniciar sesión 



Foros Linux » Desarrollo » Programación


Nuevo tema Responder al tema
 [ 2 mensajes ] 
Patrocinadores

Autor
Buscar:
Mensaje

Desconectado
Forista Nuevo
Forista Nuevo

Registrado: Sab Ene 07, 2012 7:07 am
Mensajes: 1

Nota Publicado: Sab Ene 07, 2012 7:17 am 
Arriba  
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..

 Perfil Email  

Desconectado
Moderador
Moderador
Avatar de Usuario

Registrado: Mié Nov 28, 2007 12:00 am
Mensajes: 1361
Ubicación: En la X del explorer (pulse para llamar)

Nota Publicado: Sab Ene 07, 2012 12:18 pm 
Arriba  
Creo que el fallo es de planteamiento....

Lo que estás haciendo es que para cada "línea" (que no tiene que ser necesariamente una línea, pero para que se entienda) que lees del archivo "ventas" QUE LEEN TANTO EL PADRE COMO EL HIJO cierras el pipe, por eso sólo enviabas un mensaje.

Te enlazo un ejemplo para que veas cómo deberías hacerlo:
http://www.gnu.org/software/libc/manual/html_node/Creating-a-Pipe.html

Código:
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);
         }
....

Eso ya lo puedes ir cambiando porque aunque creas que sólo creas dos procesos, realmente estás creando unos cuantos más. Tan sólo es una conjetura, pero es una posible razón de que los datos que estés enviando sean erróneos: tienes a varios procesos escribiendo a la vez en el mismo sitio. En cualquier caso, eso es un problema muy gordo que hay que evitar.

_________________
Descargue el gestor de mp3 "Music Manager" -> (mmlf)
Última versión del gestor "Music Manager" -> (jmmm)

 Perfil  
Mostrar mensajes previos:  Ordenar por  
 [ 2 mensajes ] 
Nuevo tema Responder al tema

Saltar a:  


¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 4 invitados

No puede abrir nuevos temas en este Foro
No puede responder a temas en este Foro
No puede editar sus mensajes en este Foro
No puede borrar sus mensajes en este Foro
No puede enviar adjuntos en este Foro

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group :: Style based on FI Subice by phpBBservice.nl :: Todos los horarios son UTC - 6 horas
Traducción al español por Huan Manwë
phpBB SEO