2014-12-29 2 views
9

Есть ли часть стандартной библиотеки для этого?Как вы выполняете межпроцессное общение (IPC) в Rust?

Я копался, но я не вижу ничего очевидного, что его реализует, или что-либо на Process, что позволит вам это сделать?

Я пропустил это? Или мне нужно выполнить некоторую работу C-wrapper для этой функции?

(если да, то это «безопасный» сериализовать объект, который Send и передать его другой процесс, а затем десериализации его там? Вот что Send значит правильно?)

+0

Доступны сокеты TCP и UDP, которые, на мой взгляд, позволяют осуществлять связь между процессами. Или вы имеете в виду определенный тип IPC? Может быть, есть что-то существующее, с которым вы хотите взаимодействовать? Есть ли примеры IPC, которые вы имеете в виду? – Shepmaster

ответ

11

Там нет ни одного благословенный способ сделать межпроцессное общение в 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.

+0

Трубы или общая память являются стандартными механизмами IPC, о которых я говорю. – Doug

2

Рекомендую вам посмотреть на plibsys library. Тривиальный bindgen binding is available в качестве отправной точки для тех, кто хочет написать идиоматическую привязку ржавчины.

Если все, что вам нужно, просто, практический IPC в Rust, возвращаясь к механизмам C IP, в настоящее время является единственным реальным решением; plibsys - это просто удобный портативный API высокого уровня C для этого.

Смежные вопросы