【发布时间】:2015-04-18 21:20:41
【问题描述】:
write(2) 的函数签名是 ssize_t write(int fd, const void *buf, size_t count)。一般size_t的最大值大于ssize_t的最大值。这是否意味着write实际上可以写入的数据量实际上是SSIZE_MAX而不是SIZE_MAX?如果不是这样,当写入的字节数大于SSIZE_MAX 时会发生什么情况?
我基本上想知道write 写入的数据量是否受SSIZE_MAX 或SIZE_MAX 的限制。
【问题讨论】:
-
进程也有限制。超过
process's file size limit的进程将失败(错误EFBIG),因此该限制可能小于SSIZE_T_MAX,尽管我对此不确定。 -
SSIZE_T 代表有符号大小,因此意味着它是一个有符号数。这就是在写系统调用期间发生一些错误的情况。所以最大写入次数不能大于signed Size_t
-
pendrive,我知道很多。这根本没有解决我的问题。返回值是
ssize_t,在大多数系统上它的范围比size_t更有限,所以我本质上是在询问写入是否受SSIZE_MAX或SIZE_MAX的限制。 -
请注意,大于
PTRDIFF_MAX(通常等于SIZE_MAX/2和SSIZE_MAX)的对象不应该出现在高质量的实现中,如果出现,指针减法是不安全的(可以溢出并产生UB)。因此,您传递给write的有效大小永远不应该大于SSIZE_MAX。