【问题标题】:How do you do interprocess communication (IPC) in Rust?你如何在 Rust 中进行进程间通信(IPC)?
【发布时间】:2015-02-25 07:24:24
【问题描述】:

有这方面的标准库的一部分吗?

我一直在挖掘,但我看不到任何明显的实现它的东西,或者Process 上的任何东西可以让你这样做?

我错过了吗?还是我必须为此功能做一些 C 包装工作?

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

【问题讨论】:

  • TCP 和 UDP 套接字可用,在我看来这允许进程之间的通信。或者您的意思是特定类型的 IPC?也许有一些你想与之互操作的东西?有没有您想到的 IPC 示例?

标签: ipc rust


【解决方案1】:

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

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

例如,IPC 的基本形式之一是父进程和子进程之间的标准输入/标准输出管道。 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

【讨论】:

  • 管道或共享内存是我指的标准 IPC 机制。
【解决方案2】:

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

如果你所追求的只是 Rust 中简单实用的 IPC,那么回退到 C IPC 机制是目前唯一真正的解决方案; plibsys 只是一个方便的可移植高级 C API 来执行此操作。

【讨论】:

    猜你喜欢
    • 2014-09-21
    • 2014-11-18
    • 2011-08-25
    • 1970-01-01
    • 2011-08-28
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    相关资源
    最近更新 更多