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