void padre(int tuberia,char *fichero,int pidhijo)
{     
      fd_set conjunto;
      int num_conj, descriptor,tamano;
      char buffer[100];
[...]
            if(select(tuberia+1,&conjunto,NULL,NULL,NULL)==-1)
            {
                  perror("error de select");
                  exit(6);
            }

            if(FD_ISSET(0,&conjunto)!=0)/*lectura de entrada estandar*/
            {
                  tamano=read(0,buffer,100);
                  if(tamano==-1)
                  {
                        perror("error en read");
                        exit(7);
                  }

                  if(write(descriptor,buffer,tamano)==-1)
                  {
                        perror("error en write");
                        exit(8);
                  }
            }
            if(FD_ISSET(tuberia,&conjunto)!=0)/*lectura de tuberia*/
            {
                  tamano=read(tuberia,buffer,100);
                  if(tamano==-1)
                  {
                        perror("error en read");
                        exit(9);
                  }

                  if(write(descriptor,buffer,tamano)==-1)
                  {
                        perror("error en write");
                        exit(10);
                  }
            }

      } while(tamano>0);/*CRTL-D hace que read lea el valor 0*/
El error se produce en el siguiente escenario: el usuario ha pulsado CTRL-D para indicar que desea terminar y hay datos en la tubería al mismo tiempo. select vuelve con valor igual a 2, pues los dos descriptores necesitan atención. Se entra en el primer if donde tamano toma correctamente el valor 0. Pero al entrar en el segundo if la variable tamano es sobreescrita con lo que no se abandona el bucle while, como sería preceptivo.

DESCUBRIDOR

Moebius, del curso 2001-02. Recibió 0.1 puntos.


© 2002 Guillermo González Talaván.