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-streams
crate等。
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