2014-12-29 21 views
9

Bunun için standart kitaplığın bir kısmı var mı?Rust'ta işlemler arası iletişimi (IPC) nasıl işlersiniz?

Etrafında kazmaya başladım, ama bunu uygulayan hemen belli olan herhangi bir şey göremiyorum, ya da Process üzerinde bunu yapmanıza izin verecek herhangi bir şey var mı?

Bunu özledim mi? Ya da bu işlevsellik için C-sarıcı işi yapmak zorunda mıyım?

+0

Aklımda işlemler arasında iletişim kurmayı sağlayan TCP ve UDP soketleri var. Yoksa belirli bir IPC türünü mi kastediyorsunuz? Belki birlikte çalışmak istediğiniz bir şey var mı? Akılda tuttuğunuz IPC'nin örnekleri var mı? – Shepmaster

cevap

11

yapmak için hiçbir tek mübarek yolu yoktur (bu nedenle, o zaman orada bu serisini? Yani Send doğru anlama geliyor?, Send olan bir nesne seri ve ona başka bir işlem geçmesine 'güvenli' it ise) Rust'ta süreçler arası iletişim. İstediğiniz teknolojiyi kullanmanız gerekecek: borular, çıplak yuvalar (TCP veya UDP), paylaşılan bellek, nanomsg/ZeroMQ, her neyse. Ayrıca, Send da SendSend, bunu uygulayan ve başka bir işleme gönderen bir nesneyi serileştirebileceğiniz anlamına gelmez. Bu, verilerin güvenli bir şekilde başka bir parçasına gönderilebileceği anlamına gelir (ör., Kaynak parçacığı yığınında herhangi bir referans içermez) ve serileştirme ile ilgili değildir. Örneğin, IPC'nin temel formlarından biri ana ve alt süreçler arasında stdin/stdout borularıdır. Örneğin;

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); 
} 

Yoksa yuvalarını kullanabilirsiniz, ancak örnek oldukça büyük olacaktır: Process API bu borular sayesinde veri göndermek ve almak için izin verir. Soket API belgelerini here bulabilirsiniz.

+0

Borular veya paylaşılan bellek, atıfta bulunduğum standart IPC mekanizmalarıdır. – Doug

2

plibsys library'a bakmanızı öneririz. Bir idiomatic Pas bağlaması yazmak isteyen herkes için bir başlangıç ​​noktası olarak önemsiz bir bindgen binding is available.

Eğer her şeyiniz basitse, Rust'ta pratik IPC, C IPC mekanizmalarına geri dönmek şu anda tek gerçek çözümdür; plibsys, bunu yapmak için basit bir taşınabilir yüksek seviye C API'sidir.