内存映射文件时“fd无法读取或写入”

时间:2015-03-14 14:53:49

标签: rust

我正在尝试将数据写入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),
    }
}

1 个答案:

答案 0 :(得分:2)

使用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. 为“fd无法读取或写入”代码加密,导致this lineErrFdNotAvail对齐(也可能已将mmap err = {}更改为{{ 1}})。

  2. 搜索该枚举变体会导致this line,它会映射基础mmap err = {:?}错误。

  3. 选中man page for mmap以查看libc::EACCES说的内容:

  4.   

    标志PROT_READ被指定为prot参数的一部分,fd未打开以供阅读。标志MAP_SHARED和PROT_WRITE被指定为flags和prot参数的一部分,fd未打开进行写入。