我尝试将数据写入到一个锈内存映射文件,但它不会记忆,因为它规定给定的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
是只写模式,而是你正试图地图读取和写入文件。 使用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),
}
}
我想通了这一点通过
Grepping代码为“FD不可用于读取或写入”,从而导致这条线 ,这对准到ErrFdNotAvail
(也可能已经改变mmap err = {}
至mmap err = {:?}
)。
搜索该枚举变异导致这条线 ,它映射底层libc::EACCES
错误。
检查了手册页mmap
,看看有什么EACCES
说:
标志PROT_READ被指定为prot参数的一部分,FD没有打开阅读。 标志MAP_SHARED和PROT_WRITE被指定为标志和prot参数的一部分,FD未打开,无法写入。