I'm looking for a way to mimick a terminal for some automated testing: i.e. start a process and then interact with it via sending data to stdin and reading from stdout. E.g. sending some lines of input to stdin including ctrl-c
and ctrl-\
which should result in sending signals to the process.
Using std::process::Commannd
I'm able to send input to e.g. cat
and I'm also seeing its output on stdout, but sending ctrl-c
(as I understand that is 3
) does not cause SIGINT
sent to the shell. E.g. this program should terminate:
use std::process::{Command, Stdio};
use std::io::Write;
fn main() {
let mut child = Command::new("sh")
.arg("-c").arg("-i").arg("cat")
.stdin(Stdio::piped())
.spawn().unwrap();
let mut stdin = child.stdin.take().unwrap();
stdin.write(&[3]).expect("cannot send ctrl-c");
child.wait();
}
I suspect the issue is that sending ctrl-c
needs the some tty and via sh -i
it's only in "interactive mode".
Do I need to go full fledged and use e.g. termion
or ncurses
?
Update: I confused shell and terminal in the original question. I cleared this up now. Also I mentioned ssh
which should have been sh
.