15 个不稳定版本

0.8.2 2022 年 1 月 22 日
0.8.1 2021 年 8 月 23 日
0.8.0 2021 年 5 月 23 日
0.7.3 2020 年 9 月 10 日
0.5.1 2019 年 7 月 16 日

#1 in #poll

Download history 32409/week @ 2024-03-14 34179/week @ 2024-03-21 28945/week @ 2024-03-28 28544/week @ 2024-04-04 27085/week @ 2024-04-11 29979/week @ 2024-04-18 31703/week @ 2024-04-25 31877/week @ 2024-05-02 28987/week @ 2024-05-09 28249/week @ 2024-05-16 24551/week @ 2024-05-23 30176/week @ 2024-05-30 26619/week @ 2024-06-06 29539/week @ 2024-06-13 25923/week @ 2024-06-20 21875/week @ 2024-06-27

109,559 每月下载量
用于 137 个 crate (10 directly)

MIT 许可证

53KB
1K SLoC

此 crate 的目的是为了让需要与平台级别的 RawFdRawHandle 类型交互的可移植应用程序更加便捷。

而不是有条件地使用 RawFdRawHandle,可以使用 FileDescriptor 类型来管理所有权、复制、读取和写入。

FileDescriptor

这是一个稍微有些牵强的例子,但演示了如何避免调用 as_raw_fdas_raw_handle 所需的条件代码

use filedescriptor::{FileDescriptor, FromRawFileDescriptor, Result};
use std::io::Write;

fn get_stdout() -> Result<FileDescriptor> {
  let stdout = std::io::stdout();
  let handle = stdout.lock();
  FileDescriptor::dup(&handle)
}

fn print_something() -> Result<()> {
   get_stdout()?.write(b"hello")?;
   Ok(())
}

管道

Pipe 类型使得创建管道并管理管道的读写端的生命周期更加方便。

use filedescriptor::Pipe;
use std::io::{Read, Write};

let mut pipe = Pipe::new()?;
pipe.write.write(b"hello")?;
drop(pipe.write);

let mut s = String::new();
pipe.read.read_to_string(&mut s)?;
assert_eq!(s, "hello");

socketpair

socketpair 函数返回一对连接的 SOCK_STREAM 套接字,并在 POSIX 和 Windows 系统上均有效。

use std::io::{Read, Write};

let (mut a, mut b) = filedescriptor::socketpair()?;
a.write(b"hello")?;
drop(a);

let mut s = String::new();
b.read_to_string(&mut s)?;
assert_eq!(s, "hello");

轮询

mio crate 提供了强大且可扩展的 IO 多路复用,但在某些情况下,mio 并不适用。该 filedescriptor crate 提供了一个兼容 poll(2) 的接口,适用于测试一组文件描述符的准备好状态。在 Unix 系统上,这是对 poll(2) 的一个非常薄的包装,除了在 macOS 上,它实际上是对 select(2) 接口的包装。在 Windows 系统上,使用 winsock 的 WSAPoll 函数代替。

use filedescriptor::*;
use std::time::Duration;
use std::io::{Read, Write};

let (mut a, mut b) = filedescriptor::socketpair()?;
let mut poll_array = [pollfd {
   fd: a.as_socket_descriptor(),
   events: POLLIN,
   revents: 0
}];
// sleeps for 20 milliseconds because `a` is not yet ready
assert_eq!(poll(&mut poll_array, Some(Duration::from_millis(20)))?, 0);

b.write(b"hello")?;

// Now a is ready for read
assert_eq!(poll(&mut poll_array, Some(Duration::from_millis(20)))?, 1);

依赖关系

~0.3–1MB
~19K SLoC