//! POSIX shared memory //! //! # Examples //! //! ``` //! use rustix::fs::{ftruncate, Mode}; //! use rustix::mm::{mmap, MapFlags, ProtFlags}; //! use rustix::{io, shm}; //! use std::mem::size_of; //! use std::ptr::null_mut; //! //! # fn example() -> io::Result<()> { //! // A type describing the data to be shared. //! #[repr(C)] //! struct MyBufferType { //! // … //! } //! //! // Create the shared memory object. //! let shm_path = "/rustix-shm-example"; //! let fd = shm::open( //! shm_path, //! shm::OFlags::CREATE | shm::OFlags::EXCL | shm::OFlags::RDWR, //! Mode::RUSR | Mode::WUSR, //! )?; //! //! // Resize the shared memory object to the size of our data. //! ftruncate(&fd, size_of::() as u64)?; //! //! // Map the shared memory object into our address space. //! // //! // SAFETY: We're creating a new mapping that's independent of any existing //! // memory allocations. There are interesting things to say about *using* //! // `ptr`, but that's for another safety comment. //! let ptr = unsafe { //! mmap( //! null_mut(), //! size_of::(), //! ProtFlags::READ | ProtFlags::WRITE, //! MapFlags::SHARED, //! &fd, //! 0, //! )? //! }; //! //! // Use `ptr`… //! //! // Remove the shared memory object name. //! shm::unlink(shm_path)?; //! # Ok(()) //! # } //! ``` #![allow(unused_qualifications)] use crate::fd::OwnedFd; use crate::{backend, io, path}; use super::shm; pub use crate::backend::fs::types::Mode; pub use crate::backend::shm::types::ShmOFlags as OFlags; /// `shm_open(name, oflags, mode)`—Opens a shared memory object. /// /// For portability, `name` should begin with a slash, contain no other /// slashes, and be no longer than an implementation-defined limit (255 on /// Linux). /// /// Exactly one of [`shm::OFlags::RDONLY`] and [`shm::OFlags::RDWR`] should be /// passed. The file descriptor will be opened with `FD_CLOEXEC` set. /// /// # References /// - [POSIX] /// - [Linux] /// /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9799919799/functions/shm_open.html /// [Linux]: https://man7.org/linux/man-pages/man3/shm_open.3.html #[doc(alias = "shm_open")] #[inline] pub fn open(name: P, flags: shm::OFlags, mode: Mode) -> io::Result { name.into_with_c_str(|name| backend::shm::syscalls::shm_open(name, flags, mode)) } /// `shm_unlink(name)`—Unlinks a shared memory object. /// /// # References /// - [POSIX] /// - [Linux] /// /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9799919799/functions/shm_unlink.html /// [Linux]: https://man7.org/linux/man-pages/man3/shm_unlink.3.html #[doc(alias = "shm_unlink")] #[inline] pub fn unlink(name: P) -> io::Result<()> { name.into_with_c_str(backend::shm::syscalls::shm_unlink) }