#raw-pointers #syscalls #memory-safety

无需std rustix

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

135次发布

0.38.34 2024年4月22日
0.38.32 2024年3月19日
0.38.28 2023年12月9日
0.38.25 2023年11月19日
0.27.1 2021年11月19日

#1 in Unix API

Download history 2696144/week @ 2024-05-03 2742712/week @ 2024-05-10 2741189/week @ 2024-05-17 2694089/week @ 2024-05-24 2910807/week @ 2024-05-31 2810484/week @ 2024-06-07 2768237/week @ 2024-06-14 2864466/week @ 2024-06-21 2692058/week @ 2024-06-28 2758907/week @ 2024-07-05 2872338/week @ 2024-07-12 2948073/week @ 2024-07-19 2937508/week @ 2024-07-26 2896687/week @ 2024-08-02 3000349/week @ 2024-08-09 2486349/week @ 2024-08-16

1,186,347 每月下载量
2,178 个crate中(直接使用192个) 使用

Apache-2.0…

2MB
42K SLoC

rustix

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

Bytecode Alliance项目

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

rustix 提供了POSIX类似、Unix类似、Linux和Winsock系统调用类似API的内存安全且I/O安全的包装器,具有可配置的后端。它使用Rust引用、切片和返回值而不是原始指针,以及I/O安全类型而不是原始文件描述符,提供内存安全、I/O安全和来源。它使用Result来报告错误,使用bitflags而不是裸整数标志,使用Arg特质以高效接受任何Rust字符串类型,以及其他几个高效便利的工具。

rustix 是低级的,虽然 net API支持Windows Sockets 2 (Winsock),但其他API不支持Windows;有关基于此功能构建的更高级和更通用的API,请参阅cap-stdmemfdtimerfdio-streamscrate等。

rustix 目前有两个后端可用

  • linux_raw,它使用原始Linux系统调用和vDSO调用,支持在Linux x86-64、x86、aarch64、riscv64gc、powerpc64le、arm(v5以后)、mipsel和mips64el上运行,支持稳定、夜间和1.63 Rust版本。

    • 由于完全使用Rust编写,避免了libcerrno和pthread取消操作,并采用了一些专门的优化,大多数函数编译后都非常高效,通常可以完全内联到用户代码中。
    • linux_raw中的大多数函数在整个过程中都保留了内存、I/O安全和指针来源,直到系统调用。
  • libc使用libc包,该包提供了Unix家族平台上的本地libc库的绑定,以及windows-sys用于Windows的Winsock,并且可以移植到许多操作系统。

在支持它的平台上,默认启用了linux_raw后端。要启用libc后端,可以选择启用"使用libc"的cargo功能,或者在构建时将环境变量RUSTFLAGS设置为--cfg=rustix_use_libc

Cargo功能

默认启用了rustix::iorustix::fdrustix::ffi模块。其余的API使用cargo功能标志进行条件性启用。

名称 描述
event rustix::event——轮询和事件操作。
fs rustix::fs——文件系统操作。
io_uring rustix::io_uring——Linux io_uring。
mm rustix::mm——内存映射操作。
mount rustix::mount——Linux挂载API。
net rustix::net——与网络相关的操作。
param rustix::param——进程参数。
pipe rustix::pipe——管道操作。
process rustix::process——与进程相关的操作。
procfs rustix::procfs——用于读取Linux上的/proc的实用工具。
pty rustix::pty——伪终端操作。
rand rustix::rand——与随机相关的操作。
shm rustix::shm——POSIX共享内存。
stdio rustix::stdio——与stdio相关的操作。
system rustix::system—系统相关操作。
termios rustix::termios—终端I/O流操作。
thread rustix::thread—线程相关操作。
time rustix::time—时间相关操作。
use-libc 启用libc后端。

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

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

类似crate

rustix类似于nixsimple_libcunixncuapiruslrustix是为I/O安全性设计的,大多数API使用OwnedFdAsFd来操作文件描述符,而不是使用File或甚至c_int,并支持多个后端,以便它可以在所有平台上使用,包括libc支持的。与nix类似,rustix有一个优化且灵活的文件名参数机制,允许用户使用各种字符串类型,包括非UTF-8字符串类型。

relibc是一个类似的项目,旨在成为完整的"libc",包括C兼容接口和更高层次的C/POSIX标准库功能;rustix只是旨在提供安全且符合Rust语法的低级系统调用接口。与relibc不同,rustix也不倾向于支持Redox不支持的功能,如openat*at函数,这对于rustix是重要的功能。

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

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

rustixopenat2 函数类似于 openat2 库,但使用 I/O 安全类型而不是 RawFdrustix 不提供动态功能检测,因此用户必须自己处理 NOSYS 错误。

rustixtermios 模块类似于 termios 库,但使用 I/O 安全类型而不是 RawFd,并且像 tcsetattr 这样的函数的标志参数是 enum 类型而不是裸整数。此外,rustix 调用其 tcgetattr 函数为 tcgetattr,而不是 Termios::from_fd

最低支持的 Rust 版本 (MSRV)

该库当前在 Debian 稳定版上的 Rust 版本上工作,目前是 Rust 1.63。这项政策可能在未来的小版本发布中发生变化,因此使用固定版本的 Rust 的用户应将此库固定到特定版本。

最低 Linux 版本

在 Linux 平台上,rustix 至少需要 Linux 3.2。这是支持的最老版本的 Linux,或

  • 任何当前的 Rust 目标,或
  • kernel.org 在 rustix 的 MSRV 发布时。这项政策的具体内容可能会在未来发生变化,但我们的意图是始终反映“非常旧的”Linux 版本。

依赖关系

~0–11MB
~126K SLoC