diff --git a/Chapter08/Cargo.toml b/Chapter08/Cargo.toml index 7c620e3..b5794ba 100644 --- a/Chapter08/Cargo.toml +++ b/Chapter08/Cargo.toml @@ -20,3 +20,7 @@ path = "fork1.rs" [[bin]] name = "fork2" path = "fork2.rs" + +[[bin]] +name = "fork3" +path = "fork3.rs" diff --git a/Chapter08/fork3.rs b/Chapter08/fork3.rs new file mode 100644 index 0000000..a764283 --- /dev/null +++ b/Chapter08/fork3.rs @@ -0,0 +1,36 @@ +extern crate nix; +use nix::unistd::{fork,ForkResult}; +use std::{thread,time}; +use std::process; +use std::io::prelude::*; +use std::net::TcpListener; + +fn serve(listener: TcpListener) -> ! { + for stream in listener.incoming() { + let mut buffer = [0; 2048]; + let mut tcp = stream.unwrap(); + tcp.read(&mut buffer).expect("tcp read failed"); + let response = format!("respond from #{}\n", process::id()); + tcp.write(response.as_bytes()).expect("tcp write failed"); + } + panic!("unreachable"); +} + +fn main() { + let listener = TcpListener::bind("127.0.0.1:8888").unwrap(); + let mut children = Vec::new(); + + for _ in 0..3 { + match fork().expect("fork failed") { + ForkResult::Parent{ child: pid } => { children.push(pid); } + ForkResult::Child => { + serve(listener) + } + } + } + + let t = time::Duration::from_millis(1000); + loop { + thread::sleep(t); + } +}