【发布时间】:2011-04-13 22:51:03
【问题描述】:
假设计数 > 0:
ret = write(fd, buf, count);
if(ret == 0) {
// Should I try to write again
// or treat this as error?
}
有没有可能出现这种情况的情况?
【问题讨论】:
-
当π为3时我该怎么办? :-)
假设计数 > 0:
ret = write(fd, buf, count);
if(ret == 0) {
// Should I try to write again
// or treat this as error?
}
有没有可能出现这种情况的情况?
【问题讨论】:
除非您明确地将零长度传递给write,否则这将永远不会在正确的、符合 POSIX 的系统上发生。如果您想支持各种晦涩难懂的损坏的遗留专有单元,您可能必须调查每个单元上发生的情况,以及返回值为零是出现在EINTR 的位置还是EWOULDBLOCK 的位置或其他一些错误...
就我个人而言,2011 年我只是假设它不会发生。还有很多其他的东西会破坏得更糟,试图支持这些破旧的垃圾..
注意,根据 POSIX:
如果 write() 在写入任何数据之前被信号中断,它应返回 -1 并将 errno 设置为 [EINTR]。
http://pubs.opengroup.org/onlinepubs/9699919799/functions/write.html
【讨论】:
write 将失败。我认为它可能逃脱返回零的唯一方法是在任何指定的强制错误条件范围之外的其他实现定义的条件下,但这将是一个很大的延伸。
EAGAIN。阅读上述 POSIX 链接的基本原理中的历史注释。很久很久以前,在 POSIX 之前,一些系统返回 0 而不是 EAGAIN,但明确禁止这样做。
write 系统调用的结果是该系统调用写入的总字节数。在所有错误情况下,它将返回 -1。因此,如果函数返回 0,我们处于未定义状态(基于通用文档)。我会寻找任何平台特定的理由来返回 0 并根据该研究的结果进行处理。如果您没有找到特定于平台的原因,我会退出。您遇到了来自系统调用的未定义行为,这不好。
【讨论】:
您的问题已被提出并讨论过。 :) 希望this 页面有所帮助。
【讨论】: