5个版本
使用旧Rust 2015
0.2.2 | 2022年10月1日 |
---|---|
0.2.1 | 2022年8月21日 |
0.2.0 | 2022年6月6日 |
0.1.1 | 2019年11月24日 |
0.1.0 | 2018年6月9日 |
#842 in Unix APIs
26 每月下载量
在 lxtrace 中使用
26KB
329 代码行(不包括注释)
tiny-nix-ipc
一个小巧方便的Rust库,用于使用(UNIX域)套接字进行简单的同步IPC。
Socket::new_socketpair
创建一个具有您想要的设置(AF_UNIX/SOCK_SEQPACKET/CLOEXEC
)的socketpair
,但当然可以使用FromRawFd
- 如果想要轮询(使用
poll、
select、
kqueue、
epoll、mio 等抽象),使用
AsRawFd
获取 fd - 所有发送/接收方法都允许文件描述符(fd)传递
- 可以发送/接收原始 iovecs(分散-收集向量)、缓冲区、结构体和 serde 序列化的对象
- serde 是可选的,选择 Cargo 特性以选择您想要的格式(
ser_cbor、
ser_json、
ser_bincode
)
使用方法
extern crate tiny_nix_ipc;
use tiny_nix_ipc::Socket;
创建一个套接字对
let (mut prnt, mut chld) = Socket::new_socketpair().unwrap();
将套接字设置为非-CLOEXEC(例如,如果您想要执行一个应该继承套接字的不同程序)
chld.no_cloexec().unwrap();
发送字节
let data = [0xDE, 0xAD, 0xBE, 0xEF];
let sent_bytes = prnt.send_slice(&data[..], None).unwrap();
// sent_bytes == 4
接收字节
let mut rdata = [0; 4];
let (recvd_bytes, rfds) = chld.recv_into_slice::<[RawFd; 0]>(&mut rdata[..]).unwrap();
// recvd_bytes == 4, rfds == None
发送字节和一个文件描述符(例如,shmemfdrs 创建一个匿名文件,这里用作示例,当然可以是任何描述符)
let fd = shmemfdrs::create_shmem(CString::new("/test").unwrap(), 123);
let data = [0xDE, 0xAD, 0xBE, 0xEF];
let sent_bytes = prnt.send_slice(&data[..], Some(&[fd])).unwrap();
// sent_bytes == 4
接收字节和文件描述符
let mut rdata = [0; 4];
let (recvd_bytes, rfds) = chld.recv_into_slice::<[RawFd; 1]>(&mut rdata[..]).unwrap();
// recvd_bytes == 4, rfds == Some([6])
发送一个结构体,就像它的原始字节一样(不适用于指针/引用/盒等!)
struct TestStruct {
one: i8,
two: u32,
}
let data = TestStruct { one: -65, two: 0xDEADBEEF, };
let _ = prnt.send_struct(&data, None).unwrap();
接收一个结构体
let (rdata, rfds) = chld.recv_struct::<TestStruct, [RawFd; 0]>().unwrap();
// rdata == TestStruct { one: -65, two: 0xDEADBEEF, }, rfds == None
发送一个 Serde 可序列化的值,将其序列化为 CBOR(通过 serde_cbor)
tiny-nix-ipc = { version = "0", features = ["ser_cbor"] }
use serde_cbor::value::Value;
let data = Value::U64(123456); // can be your Serializable
let sent_bytes = prnt.send_cbor(&data, None).unwrap();
// sent_bytes == 4
接收一个 Serde 可反序列化的值,将其序列化为 CBOR
let (rdata, rfds) = chld.recv_cbor::<Value, [RawFd; 0]>(24).unwrap();
// rdata == Value::U64(123456)
贡献
请随意提交拉取请求!
参与本项目即表示您同意遵守贡献者行为准则。
许可证
这是一款免费且无负担的软件,已发布到公共领域。
如需更多信息,请参阅UNLICENSE
文件或unlicense.org。
依赖项
~4-6MB
~119K SLoC