#ipc #分离 #进程 #通道 #序列化 #反序列化 #权限

sandbox-ipc

一个旨在启用权限分离的 IPC 实现

5 个版本 (3 个破坏性更新)

使用旧的 Rust 2015

0.4.0 2018 年 8 月 29 日
0.3.0 2018 年 3 月 26 日
0.2.0 2017 年 11 月 9 日
0.1.1 2017 年 10 月 17 日
0.1.0 2017 年 10 月 17 日

#1657编码

每月 46 次下载

MIT/Apache

140KB
3K SLoC

sandbox-ipc

一个关注权限分离的 Rust IPC 实现。

许可证

许可方式为以下其中之一:

您可选择其中一种。

贡献

除非您明确表示,否则根据 Apache-2.0 许可证定义,您提交给作品中的任何有意包含的贡献都将如上所述双重许可,无需附加条款或条件。


lib.rs:

便捷且强大的跨平台 IPC 原语,考虑到权限分离而设计。

此 crate 的核心是 MessageChannel。它不仅可以通过 serde 自动序列化和反序列化消息,甚至可以将文件等 OS 资源发送到其他进程。要开始,请使用 MessageChannel::establish_with_child 创建子进程,并通过环境变量传输初始通道

extern crate futures;
extern crate tokio;
extern crate sandbox_ipc as ipc;
extern crate serde_json as json;

use std::{fs, env};
use std::process::Command;
use std::io::Write;

use ipc::io::SendableFile;
use futures::prelude::*; 
use tokio::runtime::Runtime;

const CHANNEL_ENV_VAR: &str = "ENV_IPC_CHANNEL";

fn main() {
    // IO operations are done within a Tokio event loop
    let mut core = Runtime::new().unwrap();
    
    let mut child_command = Command::new("some_child_executable");
    let (channel, child) = ipc::MessageChannel::<SendableFile, i32>::establish_with_child(
        &mut child_command, 8192, core.reactor(), |command, child_channel| {
            command
                .env(CHANNEL_ENV_VAR, json::to_string(child_channel).unwrap())
                .spawn()
        }
    ).unwrap();

    let secret_file = fs::File::create("secret_file.txt").unwrap();
    let channel = core.block_on(channel.send(SendableFile(secret_file))).unwrap();

    let (reason, _channel) = core.block_on(channel.into_future()).map_err(|(err, _)| err).unwrap();
    let reason = reason.unwrap();
    assert_eq!(42i32, reason);
}

fn child_main() {
    let mut core = Runtime::new().unwrap();

    let channel: ipc::ChildMessageChannel = 
        json::from_str(&env::var(CHANNEL_ENV_VAR).unwrap()).unwrap();
    let channel = channel.into_channel::<i32, SendableFile>(core.reactor()).unwrap();

    let (secret_file, channel) = core.block_on(channel.into_future())
        .map_err(|(err, _)| err).unwrap();
    let SendableFile(mut secret_file) = secret_file.unwrap();

    write!(&mut secret_file, "psst").unwrap();

    let _channel = core.block_on(channel.send(42i32)).unwrap();
}

依赖项

~3.5–4.5MB
~86K SLoC