ITADN
README.md
以下内容由 AI 翻译,如有问题请点此提交 issue 反馈

rustix

POSIX/Unix/Linux/Winsock 系统调用的安全 Rust 绑定

一个 Bytecode Alliance 项目

Github Actions CI Status zulip chat crates.io page docs.rs docs

rustix 提供了高效的内存安全和 [I/O 安全] 的 POSIX 类、Unix 类、Linux 以及 Winsock 系统调用类 API 的封装,并支持可配置的后端。它使用 Rust 引用、切片和返回值代替原始指针,使用 [I/O 安全类型] 代替原始文件描述符,从而提供内存安全、[I/O 安全] 和 [来源]。它使用 Result 来报告错误,使用 bitflags 代替裸整数标志,使用带有优化的 Arg trait 以高效接受任何 Rust 字符串类型,以及其他一些高效便利功能。

rustix 是低层的,虽然 net API 支持 Windows Sockets 2 (Winsock),但其余 API 不支持 Windows;对于基于此功能构建的更高级且更具可移植性的 API,请参阅例如 cap-stdmemfdtimerfdio-streams crate。

rustix 目前有两个可用的后端:

  • linux_raw,它使用原始 Linux 系统调用和 vDSO 调用,并支持在 x86-64、x86、aarch64、riscv64gc、powerpc64le、arm(v5 及以上)、mipsel 和 mips64el 架构上的 Linux,以及 stable、nightly 和 1.65 版本的 Rust。

    • 通过完全使用 Rust 实现,避免 libcerrno 和 pthread 取消,并采用一些专门优化,大多数函数编译为非常高效的代码,通常可以完全内联到用户代码中。
    • linux_raw 中的大多数函数将内存安全、I/O 安全和指针来源一直保留到系统调用层面。
  • libc,它使用 libc crate,该 crate 为 Unix 系列平台提供对原生 libc 库的绑定,并为 Windows 提供 windows-sys 用于 Winsock,且可移植到许多操作系统。

linux_raw 后端在支持它的平台上默认启用。若要改为启用 libc 后端,请启用 "use-libc" cargo 特性,或在构建时将 RUSTFLAGS 环境变量设置为 --cfg=rustix_use_libc

Cargo 特性

模块 rustix::iorustix::bufferrustix::fdrustix::ffirustix::ioctl 默认启用。其余 API 模块 通过 cargo 特性标志进行条件启用。

名称描述
eventrustix::event—轮询和事件操作。
fsrustix::fs—文件系统操作。
io_uringrustix::io_uring—Linux io_uring。
mmrustix::mm—内存映射操作。
mountrustix::mount—Linux 挂载 API。
netrustix::net—网络相关操作。
paramrustix::param—进程参数。
piperustix::pipe—管道操作。
processrustix::process—进程关联操作。
ptyrustix::pty—伪终端操作。
randrustix::rand—随机数相关操作。
shmrustix::shm—POSIX 共享内存。
stdiorustix::stdio—标准输入输出相关操作。
systemrustix::system—系统相关操作。
termiosrustix::termios—终端 I/O 流操作。
threadrustix::thread—线程关联操作。
timerustix::time—时间相关操作。
use-libc启用 libc 后端。
linux_4_11启用假设 Linux ≥ 4.11 的优化
linux_5_1启用假设 Linux ≥ 5.1 的优化
linux_5_11启用假设 Linux ≥ 5.11 的优化
linux_latest启用假设最新 Linux 版本的优化
use-libc-auxv使用 getauxval 代替 PR_GET_AUXV 或 "/proc/self/auxv"。
std默认开启;禁用以激活 #![no_std]
alloc默认开启;启用依赖于 alloc 的功能。

64 位大文件支持 (LFS) 和 2038 年问题 (y2038) 支持

rustix 在可用时自动使用 64 位 API,并避免暴露存在 2038 年问题或无法支持大文件的 32 位 API。例如,rustix::fstatvfs 调用 fstatvfs64,并返回一个即使在 32 位平台上也是 64 位的结构体。

类似的 crate

rustix 类似于 nixsimple_libcunixncuapiruslrustix 针对 I/O safety 进行了架构设计,大多数 API 使用 OwnedFdAsFd 来操作文件描述符,而不是 File 甚至 c_int,并支持多种后端,以便在 libc 支持的所有平台上使用直接系统调用。与 nix 类似,rustix 具有优化且灵活的文件名参数机制,允许用户使用多种字符串类型,包括非 UTF-8 字符串类型。

relibc 是一个类似的项目,旨在成为一个完整的 "libc",包括 C 兼容接口和更高级的 C/POSIX 标准库功能;rustix 仅旨在为底层系统调用提供安全且符合 Rust 习惯的接口。relibc 通常也不支持 Redox 上不支持的功能,例如对 rustix 很重要的 *at 函数,如 openat

rustix 拥有自己的直接系统调用代码,类似于 scscall crate,使用 Rust asm! 宏。rustix 还可以使用 Linux 的 vDSO 机制来优化所有架构上的 Linux clock_gettime,以及 x86 上的所有 Linux 系统调用。并且 rustix 的系统调用使用优化的 Errno 类型来报告错误。

rustix*at 函数与 openat crate 类似,但 rustix 将它们作为自由函数提供,而不是 Dir 类型的关联函数。rustixCWD 常量以安全的方式 暴露了特殊的 AT_FDCWD 值,因此用户无需打开 . 来获取当前目录句柄。

rustixopenat2 函数与 openat2 crate 类似,但使用 I/O 安全类型而不是 RawFdrustix 不提供动态特性 检测,因此用户必须自行处理 NOSYS 错误。

rustixtermios 模块与 termios crate 类似,但使用 I/O 安全类型而不是 RawFd,并且诸如 tcsetattr 等函数的 flags 参数是 enum 而不是裸整数。此外,rustix 将其 tcgetattr 函数称为 tcgetattr,而不是 Termios::from_fd

Minimum Supported Rust Version

本 crate 的最低支持 Rust 版本 (MSRV) 为 Rust 1.65

当前策略是,使用本 crate 所需的最低 Rust 版本 可能会在次要版本中提高。

Minimum Linux Version

在 Linux 平台上,rustix 至少需要 Linux 3.2。这至多是 以下版本所支持的最旧 Linux 版本:

  • any current Rust target,或
  • 在 rustix 的 MSRV 发布时 kernel.org 所支持的版本。 此策略的具体细节未来可能会改变,但我们打算让它 始终反映“非常旧”的 Linux 版本。