- extern crate nix;
- extern crate unix_socket;
- extern crate libc;
- use std::io::prelude::*;
- use nix::sys::signal::*;
- use nix::unistd::*;
- use std::thread;
- use std::time::Duration;
- use unix_socket::*;
- use std::str::*;
- use std::io::ErrorKind;
- fn stworz_pare_gniazd() -> (UnixStream,UnixStream)
- {
- UnixStream::pair().unwrap()
- }
- fn kod_dla_rodzica(krotka_z_gniazdami : (unix_socket::UnixStream,unix_socket::UnixStream), &child_no : &libc::pid_t)
- {
- let (gniazdo_dziecka,mut gniazdo_rodzica) = krotka_z_gniazdami;
- drop(gniazdo_dziecka);
- println!("Ro: Rodzic");
- std::io::stdout().flush().unwrap();
- for iteracja in 1..6 {
- println!("Ro: iteracja={}",iteracja);
- std::io::stdout().flush().unwrap();
- match (gniazdo_rodzica).write_all(b"Czesc\0") {
- Ok(_) => {},
- Err(i) => {
- thread::sleep(Duration::from_millis(300));
- kill(child_no, SIGKILL).expect("kill failed");
- println!("Ro: Błąd: {}",i);
- panic!("Panika");
- },
- }
- gniazdo_rodzica.flush().unwrap();
- thread::sleep(Duration::from_millis(650));
- }
- println!("Ro: Porzucanie gniazd w rodzicu zaraz po ostatniej iteracji");
- std::io::stdout().flush().unwrap();
- drop(gniazdo_rodzica);
- thread::sleep(Duration::from_millis(4000));
- kill(child_no, SIGKILL).expect("kill failed");
- }
- fn kod_dla_dziecka(krotka_z_gniazdami : (UnixStream,UnixStream))
- {
- let (mut gniazdo_dziecka,gniazdo_rodzica) = krotka_z_gniazdami;
- drop(gniazdo_rodzica);
- println!("Dz: Dziecko");
- gniazdo_dziecka.set_nonblocking(true).unwrap();
- std::io::stdout().flush().unwrap();
- thread::sleep(Duration::from_millis(50));
- let mut odpowiedz = String::new();
- let mut liczba_iteracji_od_nulla = 0;
- for iteracja in 1.. {
- let mut bufor_na_1_bajt = [0; 1];
- let mut wart_bool = false;
- match gniazdo_dziecka.read(&mut bufor_na_1_bajt){
- Ok(wielkosc) if wielkosc > 0 => {wart_bool = true;},
- Ok(_) => {},
- Err(blad) => {
- let numer_bledu = blad.raw_os_error().unwrap();
- if numer_bledu == 11 {
- true;
- } else {
- break;
- }
- },
- }
- println!("Dz: {}",iteracja);
- if wart_bool {
- let kawalek = &[(bufor_na_1_bajt[0])];
- let st = String::from_utf8_lossy(kawalek);
- if liczba_iteracji_od_nulla == 0 {
- print!("Dz: ");
- }
- if bufor_na_1_bajt[0] == ('\0' as u8) {
- println!("\nDz: Ilość read_exact() od ostatniego wyświetlenia {}",
- liczba_iteracji_od_nulla);
- liczba_iteracji_od_nulla = 0;
- }else {
- print!("{}",st);
- liczba_iteracji_od_nulla += 1;
- }
- }
- std::io::stdout().flush().unwrap();
- } // until killed
- }
- fn main()
- {
- let gniazda = stworz_pare_gniazd();
- match fork().expect("fork failed") {
- Fork::Parent( child ) => {
- kod_dla_rodzica(gniazda,&child);
- }
- Fork::Child => {
- kod_dla_dziecka(gniazda);
- }
- }
- }