是否有标准库的一部分?
我一直在四处寻找,但我看不到任何立即明显的实现它,或Process
上任何可以让你这样做的东西?
我错过了吗?或者我是否必须为此功能执行一些C-wrapper工作?
(如果是这样,序列化Send
对象并将其传递给另一个进程是否“安全”,然后在那里进行反序列化?那就是Send
意味着什么?)
答案 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来实现。