【问题标题】:Does Rust's standard library support direct IO file access?Rust 的标准库是否支持直接 IO 文件访问?
【发布时间】:2018-06-15 17:05:13
【问题描述】:

有没有办法用 Rust 的标准库指定O_DIRECT,还是需要使用libc

【问题讨论】:

    标签: io rust buffer


    【解决方案1】:

    您可以使用 Unix 特定 扩展 trait os::unix::fs::OpenOptionsExt:

    use std::{fs::OpenOptions, os::unix::fs::OpenOptionsExt};
    
    const O_DIRECT: i32 = 0o0040000; // Double check value
    
    fn main() {
        OpenOptions::new()
            .read(true)
            .custom_flags(O_DIRECT)
            .open("/etc/passwd")
            .expect("Can't open");
    }
    

    不过,O_DIRECT 的值是特定于平台的。我可能最终会使用 libc 来提供值。

    【讨论】:

    • 我能够让您的示例运行,但只要添加 .create(true),我就会得到 IO(Os { code: 22, kind: InvalidInput, message: "Invalid argument" })
    • @Fallen 不确定。 EINVAL The filesystem does not support the O_DIRECT flag,加上一页左右的“阅读此关于O_DIRECT
    • 我找不到关于 ext4 或 tmpfs(这似乎不太可能)是否支持 Direct IO 的明确答案,但是当我添加 .create(true) 标志时它们都不起作用。我最终使用了一个原始块设备(/dev/nvme0n1p3 - 我的 nvme 驱动器),因为我不再需要创建标志了,所以这很有效。
    • 在内核 5.4.2 上 O_DIRECTtmpfs 上不起作用,但在 btrfs 上起作用。
    猜你喜欢
    • 1970-01-01
    • 2013-10-12
    • 2016-10-01
    • 1970-01-01
    • 2019-02-06
    • 2019-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多