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 |
|
471 in Unix APIs
24KB
420 行代码
withfd
withfd 允许通过Unix套接字传递文件描述符。
这个crate提供了对 std::os::unix::net::UnixStream 和 tokio::net::UnixStream (需要tokio特性) 的适配器,允许通过它们传递文件描述符。
适配器允许您继续使用普通的 Read 和 Write (或带有tokio特性的 AsyncRead 和 AsyncWrite) 接口。文件描述符在读取时接收并存储,这与其他类似crate(如 passfd 或 sendfd)不同。这是为了解决在另一端发送文件描述符时,使用普通读取的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