Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #![feature(unique)]
- extern crate libc;
- use std::os::unix::io::AsRawFd;
- use std::ptr::Unique;
- use std::io::Write;
- const BUF_SIZE: usize = 1024;
- mod ffi {
- use libc::{c_int, size_t, off_t};
- extern {
- pub fn mmap(addr: *mut u8, len: size_t, prot: c_int, flags: c_int, fd: c_int, offset: off_t) -> *mut u8;
- pub fn munmap(addr: *mut u8, len: size_t);
- }
- }
- fn mmap<T: AsRawFd>(file: T, len: usize) -> Option<Unique<u8>> {
- unsafe {
- let fd = file.as_raw_fd();
- let mmaped = ffi::mmap(std::ptr::null_mut(), len, libc::PROT_READ | libc::PROT_WRITE, libc::MAP_SHARED, fd, 0);
- Some(Unique::new(mmaped))
- }
- }
- fn munmap(buf: Unique<u8>, len: usize) {
- unsafe { ffi::munmap(*buf, len); }
- }
- fn main() {
- let mut file = std::fs::OpenOptions::new().read(true).write(true).create(true).open("/dev/shm/mmaped_file").unwrap();
- file.write(&[0; BUF_SIZE]);
- let len = file.metadata().unwrap().len() as usize;
- let mmaped = mmap(file, len);
- if let Some(buf) = mmaped {
- let buf = unsafe { std::slice::from_raw_parts_mut(*buf, len) };
- buf[0]='h' as u8;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement