当前位置: 首页 > 面试题库 >

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

越景天
2023-03-14
问题内容

在系统调用的手册页中,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]时,大多数历史实现都会返回零



 类似资料:
  • 问题内容: 在redux文档中给出的示例中,似乎总是从中间件返回一些东西。但是,当我打电话不返回时,一切似乎都正常。 在redux源中,它似乎正在调用每个中间件的返回值。 这使我相信,它为所有中间件运行后提供了一种可选的方式来运行调度。 有人可以确认我们是否必须始终从中间件返回值吗?为什么? 问题答案: 我实际上是前几天在这条推文上发表的。 默认情况下,该方法返回传递的操作。由于中间件管道环绕,因

  • 问题内容: 我以为我会很优雅,并使用string.xml文件为诸如异常消息之类的内容定义一些常量字符串。在strings.xml中,我点击添加,选择“字符串”选项(而不是“字符串数组”),然后为其指定名称和值。我很惊讶地看到此代码不起作用: 但这失败了,因为R.string.MyExceptionMessage实际上是int类型的。我可以通过查看R.java来验证该类型。我想念什么? 问题答案:

  • 问题:被忽略的返回值是立即被析构还是在超出范围的时候被析构?? 下面的代码返回我的编译器 输出: 谁制造它,谁就不需要它。 谁买了它,它就没用了。 使用它的人既看不到也感觉不到它。 这是怎么一回事? 因此,被忽略的值会被立即析构。但是这个编译器是特定的还是标准行为的呢?

  • 问题内容: 我有以下代码。应该返回表的最后一行的mysqli_insert_id()(在本例中为“ $ last_row”)始终返回0。为什么会这样呢? 问题答案: 并 没有 返回表的最后一排的ID。从文档中,它: …返回由查询产生的ID,该查询是对具有具有AUTO_INCREMENT属性的列的表进行的。如果最后一个查询不是or 语句,或者如果修改后的表没有带有属性的列,则此函数 将返回零 。 (

  • 问题内容: 在python中,您可以让函数返回多个值。这是一个人为的例子: 这似乎很有用,但看起来它也可能被滥用(“ ..功能X已经计算出我们需要的中间值。让X也返回该值”)。 您何时应该画线并定义其他方法? 问题答案: 绝对(对于您提供的示例)。 元组是Python的一等公民 有一个内置函数可以做到这一点。 还有其他的例子:,,。 顺便说一句,括号在大多数时候不是必需的。Python库参考中的引

  • 我想检查一个数字是否是正方形,一个数字是否是三角形。问题发生在sqrt(num)上,它为我测试的所有数字返回0 我正在使用一个在线编译器,尝试了几个编译器,所以这不是一个编译问题。尝试将num声明为double和int,结果相同 我是Java新手,但对编程并不陌生,我在网上搜索了几次,检查了我的代码,一切看起来都很好,在添加用于检查三角数的变量之前,它甚至按预期工作,但在声明变量checkTri和