7 个版本
0.1.6 | 2023年2月24日 |
---|---|
0.1.5 | 2022年12月3日 |
0.1.4 | 2020年5月14日 |
0.1.3 | 2020年4月13日 |
0.1.1 | 2019年3月13日 |
#417 in Unix APIs
12,433 monthly downloads
在 15 crates (3 directly) 中使用
39KB
355 lines
passfd
Unix 套接字具有神奇的能力,可以使用神秘的 SCM_RIGHTS
API 将文件描述符从一个进程传递到另一个(无关的)进程。这个小库为 UnixStream 添加了扩展方法来使用它。
链接
- fd-passing 同样功能,不同的 API
- 关于 fd 传递的好文章
lib.rs
:
passfd
允许使用 Unix 套接字在无关进程之间传递文件描述符。
支持 tokio 0.1 和 0.2,通过 tokio_01
和 tokio_02
功能。请注意,这些功能依赖于 UnixStream 的内部表示,并且是不安全的。
示例用法
进程 1(发送方)
use passfd::FdPassingExt;
use std::fs::File;
use std::os::unix::io::AsRawFd;
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();
stream.send_fd(file.as_raw_fd()).unwrap();
进程 2(接收方)
use passfd::FdPassingExt;
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 fd = stream.recv_fd().unwrap();
let mut file = unsafe { File::from_raw_fd(fd) };
let mut buf = String::new();
file.read_to_string(&mut buf).unwrap();
println!("{}", buf);
依赖项
~0–12MB
~87K SLoC