From f664ac9d36c9fe1914745361d890cb40f878defc Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Thu, 16 Jul 2020 01:58:01 -0400 Subject: slightly better process exit handling --- examples/basic.rs | 52 ++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 46 insertions(+), 6 deletions(-) (limited to 'examples') diff --git a/examples/basic.rs b/examples/basic.rs index 8240d12..39ef088 100644 --- a/examples/basic.rs +++ b/examples/basic.rs @@ -1,14 +1,54 @@ use std::io::{Read as _, Write as _}; +use std::os::unix::io::AsRawFd as _; fn main() { - let mut cmd = pty_process::Command::new("ls").unwrap(); - cmd.args(&["--color=auto"]); + let mut cmd = pty_process::Command::new("cat").unwrap(); + // cmd.args(&["--color=auto"]); let mut child = cmd.spawn().unwrap(); - let mut buf = [0_u8; 1]; + let mut buf = [0_u8; 4096]; + let pty = cmd.pty().as_raw_fd(); + let stdin = std::io::stdin().as_raw_fd(); loop { - cmd.pty().read_exact(&mut buf).unwrap(); - print!("{}", buf[0] as char); - std::io::stdout().flush().unwrap(); + let mut set = nix::sys::select::FdSet::new(); + set.insert(pty); + set.insert(stdin); + match nix::sys::select::select(None, Some(&mut set), None, None, None) + { + Ok(n) => { + if n > 0 { + if set.contains(pty) { + match cmd.pty().read(&mut buf) { + Ok(bytes) => { + let buf = &buf[..bytes]; + print!( + "got {} bytes: '{}'", + bytes, + std::str::from_utf8(buf).unwrap() + ); + std::io::stdout().flush().unwrap(); + } + Err(e) => { + eprintln!("pty read failed: {:?}", e); + break; + } + }; + } + if set.contains(stdin) { + match std::io::stdin().read(&mut buf) { + Ok(bytes) => { + let buf = &buf[..bytes]; + cmd.pty().write_all(buf).unwrap(); + } + Err(e) => { + eprintln!("stdin read failed: {:?}", e); + break; + } + } + } + } + } + Err(e) => println!("select failed: {:?}", e), + } } child.wait().unwrap(); } -- cgit v1.2.3-54-g00ecf