9个版本
0.3.2 | 2023年12月18日 |
---|---|
0.3.1 | 2023年11月28日 |
0.2.1 | 2021年10月30日 |
0.2.0 | 2021年4月1日 |
0.1.3 | 2021年2月2日 |
#120 in Unix APIs
2,488 monthly downloads
用于 7 crates (6 directly)
35KB
631 lines
memfile
这包含了对 memfd_create
和相关文件封印 API 的轻量级封装。
MemFile
结构体表示由 memfd_create
系统调用创建的文件。这些文件是基于内存的,且完全匿名,意味着没有其他进程可以看到它们(嗯...除了在 Linux 上的 /proc
中查看)。
创建后,文件描述符可以与子进程共享,或者通过 Unix 套接字发送给另一个进程。然后可以将文件内存映射,用作共享内存。
这与 shm_open
非常相似,除了由 shm_open
创建的文件不是匿名的。根据您的应用程序,memfd
的匿名特性可能是一个很好的属性。此外,由 shm_open
创建的文件不支持文件封印。
操作系统支持
目前支持的操作系统包括
- Linux
- Android
- FreeBSD
Seal::FutureWrite
封印仅在 Linux 上受支持。
如果您喜欢的操作系统提供了 memfd_create
,请随时提交一个 PR 以添加对该操作系统的支持。
文件封印
您可以通过使用 CreateOptions::allow_sealing(true)
方法创建 MemFile
来启用文件封印功能。这允许您使用 MemFile::add_seals
方法给文件添加封印。您也可以使用 MemFile::get_seals
方法获取封印列表。
一旦将封印添加到文件中,就无法移除。每个封印都会阻止对文件执行某些类型操作。例如:Seal::Write
封印阻止通过系统调用和内存映射写入文件,而 Seal::Shrink
和 Seal::Grow
封印则阻止文件的大小调整。
这对于 Rust 来说非常有趣,因为这是唯一保证安全的内存映射方式:当文件被 Seal::Write
和 Seal::Shrink
封印后,文件内容不能改变,文件也不能被缩小。后者也非常重要,因为如果尝试从缩小过多的内存映射中读取文件,将引发 SIGBUS
信号,并可能导致您的应用程序崩溃。
另一个有趣的选项是首先为您的 MemFile
创建一个共享的可写内存映射,然后添加 Seal::FutureWrite
和 Seal::Shrink
封印。在这种情况下,只有现有的内存映射可以用来更改文件内容,即使在添加封印之后也是如此。当与其他进程共享文件时,这可以防止那些进程缩小或写入文件,而原始进程仍然可以更改文件内容。
示例
use memfile::{MemFile, CreateOptions, Seal};
use std::io::Write;
let mut file = MemFile::create("foo", CreateOptions::new().allow_sealing(true))?;
file.write_all(b"Hello world!")?;
file.add_seals(Seal::Write | Seal::Shrink | Seal::Grow)?;
// From now on, all writes or attempts to created shared, writable memory mappings will fail.
依赖项
~43KB