在系统调用的手册页中,write(2) -
ssize_t write(int fd, const void *buf, size_t count);
它说如下:
返回值 成功后,将返回写入的字节数(零表示未写入任何字节)。出错时,返回-1,并errno进行适当设置。如果count为零,并且文件描述符引用的是常规文件,则可能返回0,或者可能检测到错误。对于特殊文件,结果不可移植。
返回值
成功后,将返回写入的字节数(零表示未写入任何字节)。出错时,返回-1,并errno进行适当设置。如果count为零,并且文件描述符引用的是常规文件,则可能返回0,或者可能检测到错误。对于特殊文件,结果不可移植。
errno
我将其解释为意味着返回0只是意味着无论出于何种原因,均未写入任何内容。
但是,在处理TCP套接字的文件描述符时,UNP中的Stevens将返回值0视为致命错误(这由另一个调用exit(1)短计数的函数包装):
exit(1)
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); }
如果errno指示写入调用被接收信号的进程中断,则他仅将0视为合法返回值。
为什么?
史蒂文斯可能这样做是为了捕获行为不同的write()的旧实现。例如,单一Unix规范说(http://www.opengroup.org/onlinepubs/000095399/functions/write.html)
当此卷的IEEE Std 1003.1-2001要求返回-1并将errno设置为[EAGAIN]时,大多数历史实现都会返回零