En la página del manual de la llamada al sistema write(2) -¿Es un error un valor de retorno de 0 desde write (2) en C?
ssize_t write(int fd, const void *buf, size_t count);
que dice lo siguiente:
Valor de retorno
En caso de éxito, el número de bytes escrita son devueltos (cero indica no se ha escrito nada). En caso de error, -1 es devuelto, y
errno
se establece de manera adecuada. Si count es cero y el descriptor de archivo hace referencia a un archivo normal , se puede devolver 0 o se puede detectar un error . Para un archivo especial , los resultados no son portátiles.
Interpretaría que quiere decir que devolver 0 simplemente significa que no se escribió nada, por alguna razón arbitraria.
Sin embargo, Stevens in UNP trata a un valor de retorno de 0 como un error grave cuando se trata de un descriptor de archivo que es un socket TCP (esto es envuelto por otra función que llama a exit(1)
en un corto recuento):
ssize_t /* Write "n" bytes to a descriptor. */
writen(int fd, const void *vptr, size_t n)
{
size_t nleft;
ssize_t nwritten;
const char *ptr;
ptr = vptr;
nleft = n;
while (nleft > 0) {
if ((nwritten = write(fd, ptr, nleft)) <= 0) {
if (nwritten < 0 && errno == EINTR)
nwritten = 0; /* and call write() again */
else
return(-1); /* error */
}
nleft -= nwritten;
ptr += nwritten;
}
return(n);
}
Solo trata 0 como un valor de retorno legítimo si el errno
indica que la llamada a escritura fue interrumpida por el proceso que recibió una señal.
¿Por qué?
Eso parece indicar un estado válido que requiere un reintento similar a obtener un 'errno' de' EINTR'. Entonces, ¿por qué lo trataría como un error irrecuperable? –
Buena pregunta. En mi copia de UNP (2da edición) writen() comprueba EINTR incluso si nwritten es 0 (página 78). Parece un error en la edición 1? –
El código en mi pregunta es en realidad de la 3ª edición ... la respuesta de mark4o suena interesante ... –