函数签名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.
P.P*_*.P. 15
该类型ssize_t由POSIX定义为有符号类型,能够存储至少32767(_POSIX_SSIZE_MAX)而没有其他保证.所以它的最大值可以小于最大值size_t.
ssize_t的POSIX定义:
Run Code Online (Sandbox Code Playgroud)ssize_t用于计数字节或错误指示.
因此,您请求写入的字节数可能大于ssize_t可容纳的字节数.在这种情况下,POSIX将其留给实现.
来自write()POSIX规范:
Run Code Online (Sandbox Code Playgroud)ssize_t write(int fildes, const void *buf, size_t nbyte);如果nbyte的值大于{SSIZE_MAX},则结果是实现定义的.
Jon*_*ler 13
POSIX规范write()说:
如果值
nbyte大于{SSIZE_MAX},则结果是实现定义的.
因此,任何写入多于SSIZE_MAX字节的尝试都会导致POSIX没有强制要求的行为,但必须由系统记录(它是实现定义的,而不是未定义的行为).但是,不同的系统可能会以不同的方式处理它,并且没有什么可以阻止一个系统报告错误(可能errno设置为EINVAL)和另一个写入SSIZE_MAX字节并报告它,将其留给应用程序再次尝试其余部分,其他系统可能是创造性和做事情仍然不同.
如果你有一个64位系统,SSIZE_MAX可能比世界上最大的单一数据中心的磁盘空间大(可能是一个数量级或更多,甚至允许NSA和谷歌),所以你'不太可能遇到这个真正的问题,但在32位系统上,你可以轻松拥有超过2 GiB的空间,如果ssize_t是32位,你必须处理所有这些.(在Mac OS X 10.10.3,一个32位的构建有一个4字节size_t和ssize_t,至少在默认情况下).