#文件描述符 #消息队列 #套接字

nightly file-descriptors

包装了常见的(主要是 Linux)文件描述符,包括套接字、管道、FIFO、终端、串行端口、字符设备、epoll、POSIX 消息队列、timerfd、eventfd、signalfd、fanotify 和 inotify

28 个版本

使用旧 Rust 2015

0.9.1 2020 年 3 月 21 日
0.8.7 2019 年 1 月 31 日

#827Unix API

28 每月下载
用于 2 个 crate(通过 magic-ring-buffer

MIT 许可证

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 的扩展(SendFileSpliceRecipientSpliceSender)。

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_POLLSO_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