"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),
}
}
我想通了
Grepping "fd not available for reading or writing" 的代码,这导致 this line,与 ErrFdNotAvail
对齐(也可以将 mmap err = {}
更改为 mmap err = {:?}
).
搜索该枚举变体会导致 this line,它映射了潜在的 libc::EACCES
错误。
查看 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.
我正在尝试将数据写入 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),
}
}
我想通了
Grepping "fd not available for reading or writing" 的代码,这导致 this line,与
ErrFdNotAvail
对齐(也可以将mmap err = {}
更改为mmap err = {:?}
).搜索该枚举变体会导致 this line,它映射了潜在的
libc::EACCES
错误。查看 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.