【发布时间】:2023-04-03 08:38:02
【问题描述】:
在man 2 write 中,NOTES 部分包含以下注释:
在 Linux 上,write()(和类似的系统调用)将最多传输 0x7ffff000 (2,147,479,552) 个字节,返回实际传输的字节数。 (在 32 位和 64 位系统上都是如此。)
- 这是为什么呢?
-
DESCRIPTION路径有以下语句:
根据 POSIX.1,如果 count 大于 SSIZE_MAX,则结果为 implementation-defined
SSIZE_MAX 比0x7ffff000 大得多。为什么会有这个注释?
更新:感谢您的回答!如果有人有兴趣(并且为了更好的 SEO 来帮助开发人员),所有具有该限制的功能是:
readwritesendfile
要找到这一点,只需全文搜索手册:
% man -wK "0x7ffff000"
/usr/share/man/man2/write.2.gz
/usr/share/man/man2/read.2.gz
/usr/share/man/man2/sendfile.2.gz
/usr/share/man/man2/sendfile.2.gz
【问题讨论】:
-
平台相关。但是 write 返回一个
ssize_t,即is a long in glibc。 -
我们无法回答“为什么”的问题,即语言或操作系统设计人员为什么选择按照他们的方式做某事,我们最多只能推测。你可以看看源代码,看看有没有线索。
-
@Barmar 有时我们可以回答他们。设计选择背后的基本原理恰好被记录在案。
-
嗯,这个数字不是任意的,大概有一个客观的解释。可能与历史硬件限制或其他原因有关
-
一般elixir.bootlin.com/linux/v2.6.39.4/source/fs/read_write.c#L419 -> elixir.bootlin.com/linux/v2.6.39.4/source/fs/read_write.c#L317 -> elixir.bootlin.com/linux/v2.6.39.4/source/fs/read_write.c#L232 。一般:Linux 喜欢
int,工作在 4K 页面。在历史记录中进一步浏览以查找count > MAX_RW_COUNT ? MAX_RW_COUNT : count;行中的git blame。
标签: c linux undefined-behavior