我正在用C编写针对Linux 2.6.X内核的自定义数据库引擎,我需要知道使用O_DIRECT标志打开的文件的write()系统调用的最小写大小是多少?在文档中说,由于Linux 2.6内核版本,您可以使用512字节块。但是,如果我的硬盘使用8K块怎么办?在这种情况下,写入时是否会返回EINVAL错误?我听说具有512字节扇区的磁盘已经过时,新磁盘使用8K扇区,因此我需要确保当用户在此类磁盘上尝试使用时,我的应用程序不会崩溃。
如果可以在具有8k扇区的磁盘上使用512字节写操作,那么当我写(例如2个512字节的块)时,Linux内核是否从磁盘读取8k扇区,替换了我告诉它的1k块,该怎么办?写然后写回磁盘的8k扇区?这真的很慢!
另外,关于此问题,我还有另一个问题,如果在打开文件时使用原始设备或ext3文件系统,最小写入大小会有所不同吗?
最佳答案
不幸的是,没有通用的方法来了解O_DIRECT的约束。本手册页似乎扼杀了一切希望:
http://www.kernel.org/doc/man-pages/online/pages/man2/open.2.html
另外,我非常确定块大小可能会根据底层文件系统而变化