使用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(映射标志)就是你需要的类型:
- 添加依赖:先在
Cargo.toml中引入nix:
[dependencies] nix = "0.27" # 建议使用最新稳定版
- 正确导入与使用示例:
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链式调用设置映射标志:
- 添加依赖:
[dependencies] memmap2 = "0.9" # 建议使用最新稳定版
- 正确使用示例:
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
相关产品推荐
相关产品推荐

