56 lines
1.7 KiB
Rust
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);
|
|
}
|