Rust 中的 Unix 选择系统调用

Sum*_*mar 2 unix rust

我有一个文件描述符列表,我想找到所有可以阅读的内容。到目前为止,我正在使用下面的函数来做 python select.select(read_fds, [], [], 1),它返回准备读取流的列表。我正在尝试在 Rust 中做同样的事情。我正在使用 nix crate,但是函数select 只返回准备读取的文件描述符的数量。有没有办法获取文件描述符列表?

jus*_*nas 6

select是一个 C 函数,它就地修改您传递给它的参数(文件描述符集),而不是分配和返回一个全新的结构。nix::select只是该 C 函数的一个薄包装。Python 在这里确实是异常值,因为它通过分配包含结果的完全独立的列表来偏离 C API。

使用时nix::select,您应该检查传入的 FD 集 - 它们将被修改为仅包含准备好的文件描述符。

let mut readfds = FdSet::new();
readfds.insert(0);
readfds.insert(3);
let _ = select(&mut readfds, None, None)
for fd in readfds.fds(None) {
    println!("{:?}", fd);
}
Run Code Online (Sandbox Code Playgroud)

FdSet::fds 返回集合中文件描述符的迭代器。