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
109,559 每月下载量
用于 137 个 crate (10 directly)
53KB
1K SLoC
此 crate 的目的是为了让需要与平台级别的 RawFd
和 RawHandle
类型交互的可移植应用程序更加便捷。
而不是有条件地使用 RawFd
和 RawHandle
,可以使用 FileDescriptor
类型来管理所有权、复制、读取和写入。
FileDescriptor
这是一个稍微有些牵强的例子,但演示了如何避免调用 as_raw_fd
和 as_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