#文件描述符 #Unix套接字 #Unix #套接字 #fd

withfd

通过文件描述符发送和接收数据

4个版本

0.2.1 2024年5月25日
0.2.0 2024年5月25日
0.1.2 2024年2月23日
0.1.1 2023年4月18日
0.1.0 2023年4月18日

471 in Unix APIs


用于 3 crates (2 directly)

MIT/Apache

24KB
420 行代码

withfd

withfd 允许通过Unix套接字传递文件描述符。

这个crate提供了对 std::os::unix::net::UnixStreamtokio::net::UnixStream (需要tokio特性) 的适配器,允许通过它们传递文件描述符。

适配器允许您继续使用普通的 ReadWrite (或带有tokio特性的 AsyncReadAsyncWrite) 接口。文件描述符在读取时接收并存储,这与其他类似crate(如 passfdsendfd)不同。这是为了解决在另一端发送文件描述符时,使用普通读取的UnixStream,文件描述符会被丢弃的问题。这个适配器确保不会有文件描述符丢失。

示例

进程1

use withfd::WithFdExt;
use std::fs::File;
use std::os::unix::io::AsFd;
use std::os::unix::net::UnixListener;

let file = File::open("/etc/passwd").unwrap();
let listener = UnixListener::bind("/tmp/test.sock").unwrap();
let (stream, _) = listener.accept().unwrap();
let mut stream = stream.with_fd();
stream.write_with_fd(b"data", &[file.as_fd()]).unwrap();

进程2

use withfd::WithFdExt;
use std::fs::File;
use std::io::Read;
use std::os::unix::io::FromRawFd;
use std::os::unix::net::UnixStream;

let stream = UnixStream::connect("/tmp/test.sock").unwrap();
let mut stream = stream.with_fd();
let mut buf = [0u8; 4];
stream.read_exact(&mut buf[..]).unwrap();
let fd = stream.take_fds().next().unwrap();
let mut file = File::from(fd);
let mut buf = String::new();
file.read_to_string(&mut buf).unwrap();
println!("{}", buf);

依赖

~2–12MB
~156K SLoC