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
1,186,347 每月下载量
在 2,178 个crate中(直接使用192个) 使用
2MB
 42K  SLoC
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-std、memfd、timerfd和io-streamscrate等。
rustix 目前有两个后端可用
- 
linux_raw,它使用原始Linux系统调用和vDSO调用,支持在Linux x86-64、x86、aarch64、riscv64gc、powerpc64le、arm(v5以后)、mipsel和mips64el上运行,支持稳定、夜间和1.63 Rust版本。 - 由于完全使用Rust编写,避免了libc、errno和pthread取消操作,并采用了一些专门的优化,大多数函数编译后都非常高效,通常可以完全内联到用户代码中。
- linux_raw中的大多数函数在整个过程中都保留了内存、I/O安全和指针来源,直到系统调用。
 
- 由于完全使用Rust编写,避免了
- 
libc使用libc包,该包提供了Unix家族平台上的本地libc库的绑定,以及windows-sys用于Windows的Winsock,并且可以移植到许多操作系统。
在支持它的平台上,默认启用了linux_raw后端。要启用libc后端,可以选择启用"使用libc"的cargo功能,或者在构建时将环境变量RUSTFLAGS设置为--cfg=rustix_use_libc。
Cargo功能
默认启用了rustix::io、rustix::fd和rustix::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类似于nix、simple_libc、unix、nc、uapi和rusl。rustix是为I/O安全性设计的,大多数API使用OwnedFd和AsFd来操作文件描述符,而不是使用File或甚至c_int,并支持多个后端,以便它可以在所有平台上使用,包括libc支持的。与nix类似,rustix有一个优化且灵活的文件名参数机制,允许用户使用各种字符串类型,包括非UTF-8字符串类型。
relibc是一个类似的项目,旨在成为完整的"libc",包括C兼容接口和更高层次的C/POSIX标准库功能;rustix只是旨在提供安全且符合Rust语法的低级系统调用接口。与relibc不同,rustix也不倾向于支持Redox不支持的功能,如openat等*at函数,这对于rustix是重要的功能。
rustix有自己的代码来执行直接系统调用,类似于syscall、sc和scall crate,使用Rust的asm!宏。此外,rustix还可以使用Linux的vDSO机制优化所有架构上的Linux clock_gettime,并在x86上的所有Linux系统调用。并且,rustix的系统调用使用优化的Errno类型报告错误。
rustix 的 *at 函数类似于 openat 库,但 rustix 以自由函数的形式提供,而不是 Dir 类型的关联函数。 rustix 的 CWD 常量以安全的方式公开了特殊的 AT_FDCWD 值,因此用户无需打开 . 来获取当前目录句柄。
rustix 的 openat2 函数类似于 openat2 库,但使用 I/O 安全类型而不是 RawFd。 rustix 不提供动态功能检测,因此用户必须自己处理 NOSYS 错误。
rustix 的 termios 模块类似于 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