28 个版本
使用旧 Rust 2015
0.9.1 | 2020 年 3 月 21 日 |
---|---|
0.8.7 | 2019 年 1 月 31 日 |
#827 在 Unix API
28 每月下载
用于 2 个 crate(通过 magic-ring-buffer)
780KB
11K SLoC
file-descriptors
file-descriptors 是一个 Rust crate,它使用安全的抽象包装各种类型的文件描述符,包括 IPv4/IPv6 套接字、Unix 域套接字、epoll、timerfd、signalfd、eventfd、POSIX 消息队列、管道、FIFO、终端(和串行端口)、字符设备、inotify、fanotify 和文件。
特别为信号和终端提供了一个非常详细且安全的包装器。
在 Android 和 Linux 上完全功能。
在 Fuchsia、Illumos(Solaris 的分支)、uclibc 和 emscripten 上部分功能。
希望支持 BSD。
支持的文件描述符
- 字符设备。
- epoll。
- eventfd。
- fanotify。
- inotify。
- POSIX 消息队列(https://linux.die.net/man/7/mq_overview>)。
- 管道和 FIFO(匿名和命名 FIFO),包括对 splice、vmsplice 和 tee 的支持。
- 套接字(TCP、UDP 和 Unix 域套接字上的等效协议;支持 sendfile)。
- 终端(串行端口和调制解调器)。
- timerfd。
此外,还实现了 Rust 的 File
的扩展(SendFile
、SpliceRecipient
和 SpliceSender
)。
Unix 域套接字
当使用文件路径时
- 将尽力创建干净的套接字文件路径;
- 确保所有父文件夹存在;
- 确保父文件夹权限设置正确;
- 删除任何陈旧的文件;
- 在释放(关闭)时删除套接字文件路径。
在通过 seccomp
锁定系统调用(特别是尝试在关闭时删除套接字文件路径)后,上述功能可能无法正常工作。
管道
- 在可能的情况下,支持对所有文件描述符使用
splice()
、vmsplice()
和tee()
(包括 Rust 的::std::fs::File
)。 - 要使用 epoll 与标准输入(
stdin
)配合,请使用pipes_and_fifos::ReceivePipeFileDescriptor::standard_in()
。 - 要使用 epoll 与标准输出(
stdout
)配合,请使用pipes_and_fifos::SendPipeFileDescriptor::standard_out()
。 - 要使用 epoll 与标准错误(
stderr
)配合,请使用pipes_and_fifos::SendPipeFileDescriptor::standard_error()
。
目前不支持
- Linux 零拷贝发送(
MSG_ZEROCOPY
)和接收(SO_ZEROCOPY
),主要是因为它们的 API 很糟糕、很复杂。 SO_BUSY_POLL
和SO_INCOMING_CPU
。- 使用
autobind
的 Unix 域套接字;设置SO_PASSCRED
套接字选项。 - 通过 Unix 域套接字使用
recvmsg()
接收凭证。 mkfifo()
.mknod()
.- infiniband 套接字。
- canbus(SocketCAN 套接字和 can4linux http://can-wiki.info/can4linux/man/can4linux_8h_source.html 字符设备驱动程序)。
许可
本项目的许可协议是 MIT。
依赖
~8–710KB
~12K SLoC