【发布时间】:2019-04-22 16:36:53
【问题描述】:
我有一个子进程,它可能会或可能不会在特定时间内向其标准输出写入内容,例如3 秒。
如果子进程标准输出中的新行以正确的开头,我想返回该行。 理想情况下,我想实现这样的事情:
use std::io::{BufRead, BufReader};
use std::thread;
use std::time::Duration;
pub fn wait_for_or_exit(
reader: &BufReader<&mut std::process::ChildStdout>,
wait_time: u64,
cmd: &str,
) -> Option<String> {
let signal: Arc<AtomicBool> = Arc::new(AtomicBool::new(false));
let signal_clone = signal.clone();
let child = thread::spawn(move || {
thread::sleep(Duration::from_millis(wait_time));
signal_clone.store(true, Ordering::Relaxed);
});
let mut line = String::new();
while !signal.load(Ordering::Relaxed) {
//Sleep a really small amount of time not to block cpu
thread::sleep(Duration::from_millis(10));
//This line is obviously invalid!
if reader.has_input() {
line.clear();
reader.read_line(&mut line).unwrap();
if line.starts_with(cmd) {
return Some(line);
}
}
}
None
}
这里唯一不起作用的是reader.has_input()。
显然,如果子进程多次重复比wait_time 更快地响应,将会有很多休眠线程,但我可以通过通道来处理。
【问题讨论】:
标签: asynchronous rust subprocess