当前位置: 首页 > 知识库问答 >
问题:

内存映射文件时“fd不可用于读取或写入”

欧镜
2023-03-14

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

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

mmap err=fd不可用于读写

这是密码

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个答案

赵景曜
2023-03-14

使用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),
    }
}

我是通过

>

搜索该enum变量会得到这一行,它映射了底层的libc::EACCES错误。

查看mmap的手册页,查看EACCES说什么:

PROT_READ标志被指定为PROT参数的一部分,并且fd未打开进行读取。标志MAP_SHARED和PROT_WRITE被指定为标志和PROT参数的一部分,fd未打开进行写入。

 类似资料:
  • 我想写一个字节向量,

  • 读 # mmap_read.py import mmap with open('lorem.txt', 'r') as f: with mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) as m: print('First 10 bytes via read :', m.read(10

  • 问题内容: 我用np.save()保存了几个numpy数组,并将它们放在一起非常大。 是否可以将它们全部加载为内存映射文件,然后对它们进行串联和切片,而无需将任何内容都加载到内存中? 问题答案: 使用显然将数组加载到内存中。为避免这种情况,您可以轻松地在新文件中创建一个thrid数组,并从要连接的数组中读取值。以更有效的方式,您还可以将新阵列追加到磁盘上已存在的文件中。 在任何情况下,您都必须为数

  • 编者按:此代码示例来自Rust 1.0之前的版本,它使用的代码在Rust 1.0中不存在。更新了一些答案,以回答更新版本的Rust的核心问题。 我正在尝试使用创建内存映射文件。目前的做法如下: 这个程序失败了 调用或对数据执行任何其他操作时。 我无法从

  • 问题内容: 最近,我碰到了这篇文章,这篇文章很好地介绍了内存映射文件以及如何在两个进程之间共享它。这是读取文件的过程的代码: 但是,我对这种方法有几点评论/问题: 如果我们仅对空文件执行读取器,即运行 这将分配8000个字节,现在将扩展文件。返回的缓冲区的限制为8000,位置为0,因此,读取器可以继续读取空数据。发生这种情况后,阅读器将停止,如。 现在应该是作家了(代码被省去了,因为它很简单,可以

  • 问题内容: 我一直在尝试编写一些非常快速的Java代码,这些代码必须执行很多I / O。我正在使用返回ByteBuffer的内存映射文件: 我遇到的问题是ByteBuffer .array()方法(应返回一个byte []数组)不适用于只读文件。我想编写我的代码,以便它可以与构造在内存中的内存缓冲区和从磁盘读取的缓冲区一起使用。但是我不想将所有缓冲区都包装为ByteBuffer.wrap()函数,