【发布时间】:2018-06-15 17:05:13
【问题描述】:
有没有办法用 Rust 的标准库指定O_DIRECT,还是需要使用libc?
【问题讨论】:
有没有办法用 Rust 的标准库指定O_DIRECT,还是需要使用libc?
【问题讨论】:
您可以使用 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" })。
EINVAL The filesystem does not support the O_DIRECT flag,加上一页左右的“阅读此关于O_DIRECT”
.create(true) 标志时它们都不起作用。我最终使用了一个原始块设备(/dev/nvme0n1p3 - 我的 nvme 驱动器),因为我不再需要创建标志了,所以这很有效。
O_DIRECT 在 tmpfs 上不起作用,但在 btrfs 上起作用。