4个版本

0.2.2 2021年12月17日
0.2.1 2021年11月14日
0.2.0 2020年2月29日
0.1.0 2020年2月29日

#970编码

每月22次下载

MIT/Apache

34KB
736 代码行

unix-ipc

这个crate实现了一个UNIX域套接字IPC的最小抽象。它允许你在进程之间发送文件句柄和Rust对象。

工作原理

它使用serde通过bincode在UNIX套接字上序列化数据。多亏了Handle抽象,你也可以发送任何可以被转换为UNIX文件句柄的对象。

其内部工作原理是在序列化和反序列化过程中跟踪遇到的文件描述符。然后它们通过UNIX套接字分别发送。这使得不相关的进程可以共享文件句柄。

如果你只想使用UNIX套接字抽象,你可以禁用所有默认特性并使用原始通道。

示例

use std::env;
use std::process;
use unix_ipc::{channel, Bootstrapper, Receiver, Sender};
use serde::{Deserialize, Serialize};

const ENV_VAR: &str = "PROC_CONNECT_TO";

#[derive(Serialize, Deserialize, Debug)]
pub enum Task {
    Sum(Vec<i64>, Sender<i64>),
    Shutdown,
}

if let Ok(path) = env::var(ENV_VAR) {
    let receiver = Receiver::<Task>::connect(path).unwrap();
    loop {
        match receiver.recv().unwrap() {
            Task::Sum(values, tx) => {
                tx.send(values.into_iter().sum::<i64>()).unwrap();
            }
            Task::Shutdown => break,
        }
    }
} else {
    let bootstrapper = Bootstrapper::new().unwrap();
    let mut child = process::Command::new(env::current_exe().unwrap())
        .env(ENV_VAR, bootstrapper.path())
        .spawn()
        .unwrap();

    let (tx, rx) = channel().unwrap();
    bootstrapper.send(Task::Sum(vec![23, 42], tx)).unwrap();
    println!("sum: {}", rx.recv().unwrap());
    bootstrapper.send(Task::Shutdown).unwrap();
}

许可:MIT/Apache-2.0

依赖

~2MB
~43K SLoC