diff options
author | Jesse Luehrs <doy@tozt.net> | 2020-07-16 01:58:01 -0400 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2020-07-16 01:58:01 -0400 |
commit | f664ac9d36c9fe1914745361d890cb40f878defc (patch) | |
tree | 539d21eb6ccd075ec8c494dfb4c6afc202dbd9cf /examples | |
parent | 3d54d1f4cb7274280f4e01e101137e91f336bc5c (diff) | |
download | pty-process-f664ac9d36c9fe1914745361d890cb40f878defc.tar.gz pty-process-f664ac9d36c9fe1914745361d890cb40f878defc.zip |
slightly better process exit handling
Diffstat (limited to 'examples')
-rw-r--r-- | examples/basic.rs | 52 |
1 files changed, 46 insertions, 6 deletions
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(); } |