从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

回到顶部