你如何在Rust中进行进程间通信(IPC)?

时间:2014-12-29 04:08:47

标签: ipc rust

是否有标准库的一部分?

我一直在四处寻找,但我看不到任何立即明显的实现它,或Process上任何可以让你这样做的东西?

我错过了吗?或者我是否必须为此功能执行一些C-wrapper工作?

(如果是这样,序列化Send对象并将其传递给另一个进程是否“安全”,然后在那里进行反序列化?那就是Send意味着什么?)

2 个答案:

答案 0 :(得分:14)

在Rust中没有单一的祝福方式来进行进程间通信。您将需要使用您想要的任何技术:管道,裸套接字(TCP或UDP),共享内存,nanomsg / ZeroMQ等等。

同样Send并不意味着您可以序列化实现它的类型的对象并发送到另一个进程。这意味着数据可以安全地发送到另一个线程(例如,它不包含对源线程堆栈的任何引用),并且它与序列化无关。

例如,IPC的基本形式之一是父进程和子进程之间的stdin / stdout管道。 Process API允许您通过这些管道发送和接收数据:

use std::io::process::Command;

fn main() {
    let mut p = Command::new("tr").arg("a-z").arg("A-Z").spawn().unwrap();

    {
        let mut p_stdin = p.stdin.as_mut().unwrap();
        p_stdin.write_str("hello world").unwrap();
    }
    p.wait().unwrap().success();

    let response = p.stdout.as_mut().unwrap().read_to_string().unwrap();
    println!("Responded: {}", response);
}

或者您可以使用套接字,但示例会非常大。您可以找到套接字API文档here

答案 1 :(得分:3)

我建议您查看plibsys library。一个简单的bindgen binding is available作为任何想要编写一个惯用的Rust绑定的人的起点。

如果你所追求的只是简单,实用的Rust in Rust,那么回归到C IPC机制是目前唯一真正的解决方案; plibsys只是一个方便的便携式高级C API来实现。