【发布时间】:2021-06-19 04:50:39
【问题描述】:
我需要与另一个进程交互。 我想使用两个线程,一个用于在 stdout 中读取,一个用于在 stderr 上读取,这些线程将读取的每一行传递到一个通道。 主线程收集行并检查超时,如果发生超时,则应终止进程。
我的问题是如何共享 std-out/err 句柄,并且在发生超时时仍然能够在以后终止进程。
let mut stdout = process.stdout.unwrap();
let (tx_stdout, rx_stdout): (Sender<Result<Vec<u8>, ExecutionError>>, Receiver<Result<Vec<u8>, ExecutionError>>) = mpsc::channel();
std::thread::spawn(move || {
PowerShell::read_lines(&tx_stdout, stdout);
});
let mut stderr = process.stderr.unwrap();
let (tx_stderr, rx_stderr): (Sender<Result<Vec<u8>, ExecutionError>>, Receiver<Result<Vec<u8>, ExecutionError>>) = mpsc::channel();
std::thread::spawn(move || {
PowerShell::read_lines(&tx_stderr, &mut stderr);
});
process.kill(); // this is not possible
我明白为什么编译器会出现问题,但我不知道如何解决这个问题。 正确使用 Arc 会导致同样的问题。
你对我有什么建议吗?
【问题讨论】:
标签: multithreading rust