
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.