#ipc #unix #unix-domain-socket #sockets #file-descriptor #system

tiny-nix-ipc

使用文件描述符传递的套接字IPC的最小包装器

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 代码行(不包括注释)

unlicense crates.io

tiny-nix-ipc

一个小巧方便的Rust库,用于使用(UNIX域)套接字进行简单的同步IPC。

  • Socket::new_socketpair 创建一个具有您想要的设置(AF_UNIX/SOCK_SEQPACKET/CLOEXEC)的 socketpair,但当然可以使用 FromRawFd
  • 如果想要轮询(使用 pollselectkqueueepollmio 等抽象),使用 AsRawFd 获取 fd
  • 所有发送/接收方法都允许文件描述符(fd)传递
  • 可以发送/接收原始 iovecs(分散-收集向量)、缓冲区、结构体和 serde 序列化的对象
  • serde 是可选的,选择 Cargo 特性以选择您想要的格式(ser_cborser_jsonser_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)

贡献

请随意提交拉取请求!

参与本项目即表示您同意遵守贡献者行为准则

贡献者名单可在GitHub上找到.

许可证

这是一款免费且无负担的软件,已发布到公共领域。
如需更多信息,请参阅UNLICENSE文件或unlicense.org

依赖项

~4-6MB
~119K SLoC