1
Fork 0
rust-ipc/src/main.rs

56 lines
1.7 KiB
Rust

use ipc_channel::ipc::*;
use ipc_channel::ipc;
use std::io::Error;
// I'm not actually sure invoking this is indeed unsafe -- but better safe than sorry...
pub unsafe fn fork<F: FnOnce()>(child_func: F) -> libc::pid_t {
match libc::fork() {
-1 => panic!("Fork failed: {}", Error::last_os_error()),
0 => {
child_func();
libc::exit(0);
},
pid => pid,
}
}
fn main() {
println!("Hello, world!");
// server0 = Send server1 to server
// server1 = server -> client
// server2 = client -> server
let (server0, server0_name) = IpcOneShotServer::new().unwrap();
let (server2, server2_name) = IpcOneShotServer::new().unwrap();
dbg!(&server0_name);
dbg!(&server2_name);
let child_pid = unsafe {
fork(|| {
let (tx1, rx1): (IpcSender<String>, IpcReceiver<String>) = ipc::channel().unwrap();
// Send Sender back to server so it can talk to us
let tx0 = IpcSender::connect(server0_name).unwrap();
tx0.send(tx1).unwrap();
// Wait for data from server
let input = rx1.recv().unwrap();
println!("{}", input);
// Send data back to server
let tx2: IpcSender<String> = IpcSender::connect(server2_name).unwrap();
tx2.send(String::from("Foo")).unwrap();
})
};
// Receive the sender from the client so we can send it data
let (_, tx1): (_, IpcSender<String>) = server0.accept().unwrap();
tx1.send(String::from("Bar")).unwrap();
// Receive data from client
let (_, received_person): (_, String) = server2.accept().unwrap();
println!("{}", received_person);
}