CUESTIÓN

¿Qué puede estar fallando aquí?:
if(i=read(fd,buffer,longitud)==-1)
    {sprintf(etiqueta,"%s:%s",argv[0],argv[1]);
     perror(etiqueta);
     return 1;}

printf("longitud=%d\n",i); 
Siempre me pone que read lee cero caracteres, por más que la longitud que pongo sea mayor que cero y el búfer esté bien definido.


SOLUCIÓN

Es bastante habitual combinar varias sentencias en C en una única, pero hay que tener cuidado con la precedencia de los operadores. El problema está en el if. El operador de comparación de igualdad de C (==) tiene mayor precedencia que el operador de asignación (=). Por lo tanto en el if, primero se ejecuta la llamada read, luego se mira si valor devuelto es -1 y el resultado lógico de esta comparación (0-> falso o 1-> verdadero) se asigna a la variable i. La línea correctamente escrita quedaría:
if ( (i=read(fd,buffer,longitud)) ==-1)
    {sprintf(etiqueta,"%s:%s",argv[0],argv[1]);
o, para mi gusto, mucho más clara:
i=read(fd,buffer,longitud);
if (i==-1)
    {sprintf(etiqueta,"%s:%s",argv[0],argv[1]);

© 2000 Guillermo González Talaván.