小智 6
迟到总比不到好 :)
快速回答是:“2,147,479,552 字节,如果内核版本是 3.14 或更高版本”
详细回答:
据我了解,它是关于写系统调用的:
http://man7.org/linux/man-pages/man2/write.2.html
1) 任何 POSIX 系统(linux、bsd、所有 unix)都保证能够写入MAX_SSIZE 字节
根据POSIX.1,如果count大于SSIZE_MAX,结果是实现定义的;有关 Linux 上的上限,请参阅 NOTES。
# getconf SSIZE_MAX
32767
Run Code Online (Sandbox Code Playgroud)
2) linux 保证能够写入高达 1.99 GiB(这是 linux 内核版本 3.14 和更新版本的原子操作)
在 Linux 上,write()(和类似的系统调用)将最多传输 0x7ffff000(2,147,479,552)个字节,返回实际传输的字节数。(在 32 位和 64 位系统上都是如此。)
但它只是来自 linux 内核 3.14 的公平原子操作
根据 POSIX.1-2008/SUSv4 Section XSI 2.9.7(“与常规文件操作的线程交互”):
在 POSIX.1-2008 中指定的效果中,当它们对常规文件或符号链接进行操作时,以下所有函数都应该是原子的: ...
随后列出的 API 包括 write() 和 writev(2)。跨线程(和进程)应该是原子的,其中包括文件偏移的更新。但是,在 3.14 版之前的 Linux 上,情况并非如此:如果共享打开文件描述(请参阅 open(2))的两个进程同时执行 write()(或 writev(2)),则 I /O 操作在更新文件偏移量方面不是原子的,因此两个进程输出的数据块可能(错误地)重叠。此问题已在 Linux 3.14 中修复。