“FD不可用于读取或写入”时,内存映射文件(“fd not available for readin

2019-10-22 06:35发布

我尝试将数据写入到一个锈内存映射文件,但它不会记忆,因为它规定给定的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),
    }
}

Answer 1:

与创建的文件File::create是只写模式,而是你正试图地图读取和写入文件。 使用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不可用于读取或写入”,从而导致这条线 ,这对准到ErrFdNotAvail (也可能已经改变mmap err = {}mmap err = {:?} )。

  2. 搜索该枚举变异导致这条线 ,它映射底层libc::EACCES错误。

  3. 检查了手册页mmap ,看看有什么EACCES说:

标志PROT_READ被指定为prot参数的一部分,FD没有打开阅读。 标志MAP_SHARED和PROT_WRITE被指定为标志和prot参数的一部分,FD未打开,无法写入。



文章来源: “fd not available for reading or writing” when memory-mapping a file
标签: rust