2014-12-29 23 views
9

Czy istnieje część standardowej biblioteki do tego?Jak przeprowadzasz komunikację międzyprocesową (IPC) w Rust?

Przeszukujełem, ale nie widzę niczego od razu oczywistego, który to implementuje, lub czegokolwiek na Process, które pozwoliłoby ci to zrobić?

Czy tęskniłem za tym? Czy muszę wykonać niektóre operacje C-wrapper dla tej funkcjonalności?

(jeśli tak, to jest „bezpieczne” do serializacji obiektu, który jest Send i przekazać go inny proces, a następnie deserializować go tam? To co Send oznacza, prawda?)

+0

Dostępne są gniazda TCP i UDP, co w mojej głowie pozwala na komunikację między procesami. Czy masz na myśli konkretny typ IPC? Może istnieje coś, z czym chcesz współpracować? Czy są jakieś przykłady IPC, które masz na myśli? – Shepmaster

Odpowiedz

11

Nie ma jednej błogosławiony sposób zrobić komunikacja międzyprocesowa w Rust. Będziesz musiał użyć dowolnej technologii: rur, gołych gniazd (TCP lub UDP), pamięci współdzielonej, nanomsg/ZeroMQ, cokolwiek.

Również Send nie oznacza, że ​​można serializować obiekt typu, który go implementuje i wysyła do innego procesu. Oznacza to, że dane mogą być bezpiecznie wysyłane do innego wątku wątku (np. Nie zawiera żadnych odniesień do stosu wątku źródłowego) i nie jest związane z serializacją.

Na przykład jedną z podstawowych form IPC są stdin/stdout między procesami nadrzędnymi i podrzędnymi. Process API pozwala na wysyłanie i odbieranie danych za pomocą tych rur:

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

Albo można użyć gniazda, ale przykładem może być dość duża. Możesz znaleźć dokumentację API gniazd here.

+0

Rury lub pamięć współdzielona to standardowe mechanizmy IPC, do których się odwołuję. – Doug

2

Polecam spojrzeć na plibsys library. Trywialny bindgen binding is available jako punkt wyjścia dla każdego, kto chce napisać idiomatyczne wiązanie rdzy.

Jeśli wszystko, czego szukasz, jest prostym, praktycznym IPC w Rust, powrót do mechanizmów C IPC jest obecnie jedynym realnym rozwiązaniem; plibsys jest po prostu wygodnym przenośnym API wysokiego poziomu, aby to zrobić.