小编典典

从C中的write(2)返回的值为0是否是错误?

linux

在系统调用的手册页中,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视为合法返回值。

为什么?


阅读 645

收藏
2020-06-07

共1个答案

小编典典

史蒂文斯可能这样做是为了捕获行为不同的write()的旧实现。例如,单一Unix规范说(http://www.opengroup.org/onlinepubs/000095399/functions/write.html

当此卷的IEEE Std 1003.1-2001要求返回-1并将errno设置为[EAGAIN]时,大多数历史实现都会返回零

2020-06-07