从C中的write(2)返回的值为0是否是错误?
在系统调用的手册页中,write(2) -
ssize_t write(int fd, const void *buf, size_t count);
它说如下:
返回值
成功后,将返回写入的字节数(零表示未写入任何字节)。出错时,返回-1,并
errno
进行适当设置。如果count为零,并且文件描述符引用的是常规文件,则可能返回0,或者可能检测到错误。对于特殊文件,结果不可移植。
我将其解释为意味着返回0只是意味着无论出于何种原因,均未写入任何内容。
但是,在处理TCP套接字的文件描述符时,UNP中的Stevens将返回值0视为致命错误(这由另一个调用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]时,大多数历史实现都会返回零
以上是 从C中的write(2)返回的值为0是否是错误? 的全部内容, 来源链接: utcz.com/qa/423223.html