c - O_DIRECT 的最小写入大小

标签 c linux

我正在用 C 为 Linux 2.6.X 内核编写自定义数据库引擎,我需要知道对于使用 O_DIRECT 标志打开的文件的 write() 系统调用的最小写入大小是多少?在文档中说,自 linux 2.6 内核版本以来,您可以使用 512 字节 block 。但是,如果我的硬盘使用 8K block 怎么办?在这种情况下,它会在写入时返回 EINVAL 错误吗?我听说 512 字节扇区的磁盘已经过时,新磁盘使用 8K 扇区,所以我需要确保当用户在此类磁盘上尝试时我的应用程序不会崩溃。 如果可以在具有 8k 扇区的磁盘上使用 512 字节写入,当我写入时会发生什么,比如 2 个 512 字节的 block ,linux 内核是否从磁盘读取 8k 扇区,替换我告诉它的 1k block 写入然后将 8k 扇区写回磁盘?这真的很慢!

此外,关于这个问题我还有另一个问题,如果我在打开文件时使用原始设备或 ext3 文件系统,最小写入大小是否会有所不同?

最佳答案

不幸的是,没有通用的方法来了解 O_DIRECT 的约束。这个手册页似乎扼杀了任何希望:

http://www.kernel.org/doc/man-pages/online/pages/man2/open.2.html

此外,我很确定 block 大小可能会根据底层文件系统而改变

关于c - O_DIRECT 的最小写入大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8911428/

相关文章:

c++ - 如何将c/c++回调函数转换为delphi

java - 如何使用java读取linux中的命名管道(FIFO)

linux - 使用 Linux 比较两个不同的 url

c - 矩阵加/乘的 pthread 加速

c - 具有可变大小数组的结构

c - 如何解决vfmadd213ps的 "illegal instruction"?

c - 如何使用 C 中的 .h 文件从外部 .c 文件调用函数?

linux - 从 CRAN Ubuntu 存储库安装 R : No Public Key Error

linux - 为什么 Linux 的调度程序将两个线程放在具有超线程的处理器上的同一个物理内核上?

Linux:CPU 基准测试需要更长的时间和不同的 CPU 利用率级别