You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用nix mmap时出现no PROT_READ in sys::mman错误,如何使用MmapProt和MmapFlag?

解决“no PROT_READ in sys::mman”错误及正确使用MmapProt/MmapFlag的方法

你遇到的这个错误,本质是直接引用了POSIX标准里的PROT_READ这类裸宏,但在Rust的系统调用封装库(比如nix或memmap2)中,内存保护权限和映射标志已经被封装成了类型安全的枚举/常量,而非直接暴露这些宏名。下面分两种常用库的场景,给你讲正确的用法:

一、使用nix crate(偏向底层系统调用)

nix是对POSIX系统调用的安全封装,sys::mman模块里的MmapProt(内存保护权限)和MmapFlags(映射标志)就是你需要的类型:

  1. 添加依赖:先在Cargo.toml中引入nix:
[dependencies]
nix = "0.27"  # 建议使用最新稳定版
  1. 正确导入与使用示例:
use nix::sys::mman::{mmap, munmap, MmapProt, MmapFlags};
use nix::unistd::sysconf;
use nix::sys::sysconf::SysconfVar;
use std::ptr;

fn main() -> nix::Result<()> {
    // 获取系统页大小(mmap的映射大小通常需要是页的整数倍)
    let page_size = sysconf(SysconfVar::PAGE_SIZE)?.unwrap() as usize;
    
    // 调用mmap创建匿名共享内存
    let addr = mmap(
        ptr::null_mut(),  // 让内核自动选择映射地址
        page_size,        // 映射内存的大小
        // 组合读写权限
        MmapProt::PROT_READ | MmapProt::PROT_WRITE,
        // 组合共享+匿名标志(匿名内存无需关联文件)
        MmapFlags::MAP_SHARED | MmapFlags::MAP_ANONYMOUS,
        -1,               // 匿名内存不需要文件描述符,填-1
        0,                // 文件偏移量,匿名内存填0
    )?;
    
    // 安全操作映射的内存
    unsafe {
        let slice = std::slice::from_raw_parts_mut(addr as *mut u8, page_size);
        slice[0] = 0x42;
        println!("First byte of mapped memory: {}", slice[0]);
    }
    
    // 使用完毕后解除映射
    munmap(addr, page_size)?;
    
    Ok(())
}

二、使用memmap2 crate(更易用的文件映射封装)

如果你主要做文件内存映射,memmap2的API更友好,它用ProtFlags对应权限,通过MmapOptions链式调用设置映射标志:

  1. 添加依赖:
[dependencies]
memmap2 = "0.9"  # 建议使用最新稳定版
  1. 正确使用示例:
use memmap2::{MmapOptions, ProtFlags};
use std::fs::File;
use std::io::Write;

fn main() -> std::io::Result<()> {
    // 创建一个临时文件用于内存映射
    let mut file = File::create("temp_mmap.bin")?;
    // 写入足够内容(映射大小不能超过文件实际大小)
    file.write_all(&[0u8; 4096])?;
    
    // 创建可读写的共享内存映射
    let mut mmap = MmapOptions::new()
        // 设置读写权限
        .prot_flags(ProtFlags::READ | ProtFlags::WRITE)
        // 开启共享映射(修改会同步到文件)
        .map_shared()
        // 关联到目标文件
        .map_mut(&file)?;
    
    // 直接操作映射切片,无需unsafe(memmap2已做安全封装)
    mmap[0] = 0x69;
    println!("First byte of mapped file: {}", mmap[0]);
    
    Ok(())
}

关键注意事项

  • 绝对不要直接使用PROT_READ/MAP_SHARED这类裸宏,必须用对应库提供的枚举值(比如MmapProt::PROT_READ)
  • 多个权限或标志需要用位或操作符|来组合
  • 不同库的命名有差异,比如memmap2用ProtFlags而nix用MmapProt,使用前可以查下库的官方文档
  • 确保依赖版本正确,不同版本的库API可能有细微变化

内容的提问来源于stack exchange,提问作者aupreti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:22:52