use cfg_if::cfg_if; use std::os::unix::io::{FromRawFd, OwnedFd, RawFd};
usecrate::errno::Errno; usecrate::Result; use std::ffi::CStr;
libc_bitflags!( /// Options that change the behavior of [`memfd_create`]. pubstruct MemFdCreateFlag: libc::c_uint { /// Set the close-on-exec ([`FD_CLOEXEC`]) flag on the new file descriptor. /// /// By default, the new file descriptor is set to remain open across an [`execve`] /// (the `FD_CLOEXEC` flag is initially disabled). This flag can be used to change /// this default. The file offset is set to the beginning of the file (see [`lseek`]). /// /// See also the description of the `O_CLOEXEC` flag in [`open(2)`]. /// /// [`execve`]: crate::unistd::execve /// [`lseek`]: crate::unistd::lseek /// [`FD_CLOEXEC`]: crate::fcntl::FdFlag::FD_CLOEXEC /// [`open(2)`]: https://man7.org/linux/man-pages/man2/open.2.html
MFD_CLOEXEC; /// Allow sealing operations on this file. /// /// See also the file sealing notes given in [`memfd_create(2)`]. /// /// [`memfd_create(2)`]: https://man7.org/linux/man-pages/man2/memfd_create.2.html
MFD_ALLOW_SEALING; /// Anonymous file will be created using huge pages. It should be safe now to /// combine with [`MFD_ALLOW_SEALING`] too. /// However, despite its presence, on FreeBSD it is unimplemented for now (ENOSYS). /// /// See also the hugetlb filesystem in [`memfd_create(2)`]. /// /// [`memfd_create(2)`]: https://man7.org/linux/man-pages/man2/memfd_create.2.html #[cfg(linux_android)]
MFD_HUGETLB; /// Following are to be used with [`MFD_HUGETLB`], indicating the desired hugetlb size. /// /// See also the hugetlb filesystem in [`memfd_create(2)`]. /// /// [`memfd_create(2)`]: https://man7.org/linux/man-pages/man2/memfd_create.2.html #[cfg(linux_android)]
MFD_HUGE_1MB; /// hugetlb size of 2MB. #[cfg(linux_android)]
MFD_HUGE_2MB; /// hugetlb size of 8MB. #[cfg(linux_android)]
MFD_HUGE_8MB; /// hugetlb size of 16MB. #[cfg(linux_android)]
MFD_HUGE_16MB; /// hugetlb size of 32MB. #[cfg(linux_android)]
MFD_HUGE_32MB; /// hugetlb size of 256MB. #[cfg(linux_android)]
MFD_HUGE_256MB; /// hugetlb size of 512MB. #[cfg(linux_android)]
MFD_HUGE_512MB; /// hugetlb size of 1GB. #[cfg(linux_android)]
MFD_HUGE_1GB; /// hugetlb size of 2GB. #[cfg(linux_android)]
MFD_HUGE_2GB; /// hugetlb size of 16GB. #[cfg(linux_android)]
MFD_HUGE_16GB;
}
);
/// Creates an anonymous file that lives in memory, and return a file-descriptor to it. /// /// The file behaves like a regular file, and so can be modified, truncated, memory-mapped, and so on. /// However, unlike a regular file, it lives in RAM and has a volatile backing storage. /// /// For more information, see [`memfd_create(2)`]. /// /// [`memfd_create(2)`]: https://man7.org/linux/man-pages/man2/memfd_create.2.html #[inline] // Delays codegen, preventing linker errors with dylibs and --no-allow-shlib-undefined pubfn memfd_create(name: &CStr, flags: MemFdCreateFlag) -> Result<OwnedFd> { let res = unsafe {
cfg_if! { if#[cfg(all( // Android does not have a memfd_create symbol
not(target_os = "android"),
any(
target_os = "freebsd", // If the OS is Linux, gnu and musl expose a memfd_create symbol but not uclibc
target_env = "gnu",
target_env = "musl",
)))]
{
libc::memfd_create(name.as_ptr(), flags.bits())
} else {
libc::syscall(libc::SYS_memfd_create, name.as_ptr(), flags.bits())
}
}
};
Errno::result(res).map(|r| unsafe { OwnedFd::from_raw_fd(r as RawFd) })
}
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.11 Sekunden
(vorverarbeitet am 2026-06-18)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.