aboutsummaryrefslogtreecommitdiffstats
path: root/examples
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2020-07-16 01:58:01 -0400
committerJesse Luehrs <doy@tozt.net>2020-07-16 01:58:01 -0400
commitf664ac9d36c9fe1914745361d890cb40f878defc (patch)
tree539d21eb6ccd075ec8c494dfb4c6afc202dbd9cf /examples
parent3d54d1f4cb7274280f4e01e101137e91f336bc5c (diff)
downloadpty-process-f664ac9d36c9fe1914745361d890cb40f878defc.tar.gz
pty-process-f664ac9d36c9fe1914745361d890cb40f878defc.zip
slightly better process exit handling
Diffstat (limited to 'examples')
-rw-r--r--examples/basic.rs52
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();
}