#file #memory #shared-memory #memory-mapped #fd #memfd #sealing

memfile

使用memfd_create创建并支持文件封印的内存文件

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

Download history 1758/week @ 2024-04-07 1801/week @ 2024-04-14 1968/week @ 2024-04-21 2087/week @ 2024-04-28 1475/week @ 2024-05-05 1384/week @ 2024-05-12 1701/week @ 2024-05-19 1223/week @ 2024-05-26 1585/week @ 2024-06-02 1739/week @ 2024-06-09 1991/week @ 2024-06-16 2253/week @ 2024-06-23 979/week @ 2024-06-30 439/week @ 2024-07-07 521/week @ 2024-07-14 480/week @ 2024-07-21

2,488 monthly downloads
用于 7 crates (6 directly)

BSD-2-Clause

35KB
631 lines

Docs.rs CI

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::ShrinkSeal::Grow 封印则阻止文件的大小调整。

这对于 Rust 来说非常有趣,因为这是唯一保证安全的内存映射方式:当文件被 Seal::WriteSeal::Shrink 封印后,文件内容不能改变,文件也不能被缩小。后者也非常重要,因为如果尝试从缩小过多的内存映射中读取文件,将引发 SIGBUS 信号,并可能导致您的应用程序崩溃。

另一个有趣的选项是首先为您的 MemFile 创建一个共享的可写内存映射,然后添加 Seal::FutureWriteSeal::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