"fd not available for reading or writing" 内存映射文件时

"fd not available for reading or writing" when memory-mapping a file

我正在尝试将数据写入 Rust 中的内存映射文件,但它不会对指定文件进行内存映射,因为它声明给定的 fd 不可用。

我可以在文件系统上看到它,所以它确实存在并具有正确的权限。我怀疑这是一个错误,或者我没有以正确的方式使用新的 IO API。

mmap err = fd not available for reading or writing

这是代码

use std::fs::File;
use std::os::MemoryMap;
use std::os::unix::prelude::AsRawFd;
use std::os::MapOption::{MapFd, MapWritable, MapReadable};

fn main() {
    let f = File::create("test.dat").unwrap();
    f.set_len(n as u64);

    let fd = f.as_raw_fd();

    let mmap = MemoryMap::new(n, &[MapReadable, MapWritable, MapFd(fd)]);

    match mmap {
        Ok(_) => println!("mmap success"),
        Err(ref err) => println!("mmap err = {}", err),
    }
}

使用 File::create are in write-only mode, but you are attempting to map the file for both reading and writing. Use OpenOptions 创建的文件以获取具有两种模式的文件:

#![feature(os, std_misc)]

use std::fs::OpenOptions;
use std::os::MemoryMap;
use std::os::unix::prelude::AsRawFd;
use std::os::MapOption::{MapFd, MapReadable, MapWritable};

fn main() {
    let n = 100;

    let f = OpenOptions::new()
        .read(true)
        .write(true)
        .truncate(true)
        .create(true)
        .open("test.dat")
        .unwrap();

    f.set_len(n as u64).unwrap();

    let fd = f.as_raw_fd();

    let mmap = MemoryMap::new(n, &[MapReadable, MapWritable, MapFd(fd)]);

    match mmap {
        Ok(_) => println!("mmap success"),
        Err(err) => println!("mmap err = {}", err),
    }
}

我想通了

  1. Grepping "fd not available for reading or writing" 的代码,这导致 this line,与 ErrFdNotAvail 对齐(也可以将 mmap err = {} 更改为 mmap err = {:?}).

  2. 搜索该枚举变体会导致 this line,它映射了潜在的 libc::EACCES 错误。

  3. 查看 man page for mmap 看看 EACCES 说了什么:

The flag PROT_READ was specified as part of the prot argument and fd was not open for reading. The flags MAP_SHARED and PROT_WRITE were specified as part of the flags and prot argument and fd was not open for writing.