当 nbyte < 0 时 read(3) 如何处理?

当 nbyte < 0 时 read(3) 如何处理?

我找不到 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()大于countSSIZE_MAX产生 an EFAULT,因为不可能在进程的地址空间内容纳从字节开始buf并扩展字节的内存块。count

在 *bsd 上:

read()pread()可能返回以下错误:

[EINVAL] nbytes 大于SSIZE_MAX

在Solaris 上也是如此:

EINVAL

nbyte 参数溢出了ssize_t

注:openbsd联机帮助页提到read()成功时可能返回负值的系统;如果您知道这样的系统,请在此处或评论中添加有关它的信息。

相关内容