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