我找不到 read(3) 的手册页中定义的任何行为。我的猜测是它要么抛出一个错误,要么只返回 0。但是如果有人可以确认任何定义的行为那就太好了。或者,如果该行为在某处被指定为未定义,那么说明这一点也很好。
答案1
根据定义,这种情况不可能发生(至少在POSIX.1-2008然后)。nbyte
的参数是read()
a size_t
,它是一个无符号整数类型。
答案2
考虑函数的原型read
:
ssize_t read(int fd, void *buf, size_t count);
由于count
参数是size_t
无符号的,如果您尝试传递负数,例如。read(fd, buf, -20)
(并且您正在运行 2 的补码机器;-))这将被解释为非常大的count
,超出成功返回值的范围 -返回读取为 a , a 的read()
字节数ssize_t
签与 大小相同的整数size_t
。
在这种情况下,适用以下规定:
如果 nbyte 的值大于
{SSIZE_MAX}
,则结果是实现定义的。
这是在操作系统:
在 Linux 上,
read()
(和类似的系统调用)最多传输0x7ffff000
(2,147,479,552
) 个字节,返回实际传输的字节数。 (这在 32 位和 64 位系统上都是如此。)
实际上, aread()
大于count
会SSIZE_MAX
产生 an EFAULT
,因为不可能在进程的地址空间内容纳从字节开始buf
并扩展字节的内存块。count
在 *bsd 上:
read()
并pread()
可能返回以下错误:
[EINVAL]
nbytes 大于SSIZE_MAX
在Solaris 上也是如此:
EINVAL
nbyte 参数溢出了
ssize_t
。
注:openbsd联机帮助页提到read()
成功时可能返回负值的系统;如果您知道这样的系统,请在此处或评论中添加有关它的信息。