我有一个Rust模块,它设置了一个具有crossbeam_channel
:
fn sigint_channel() -> Result<Receiver<bool>, ctrlc::Error> {
let (sender, receiver) = unbounded();
// Handle Ctrl+C (aka SIGINT)
ctrlc::set_handler(move || {
warn!("Got SIGINT, stopping the Child ..");
let _ = sender.send(true);
})?;
Ok(receiver)
}
然后,返回的Receiver
被传递给模块函数,该模块函数运行系统命令Child
并等待一些数据通过Channel
:
if let Some(child) = get_child(cmd) {
loop {
select! {
recv(receiver) -> _ => {
kill(child);
break;
}
}
// Code never reached
child.try_wait();
}
}
现在,这项计划停滞不前,只能达到select!
.即使子元素终止,代码仍在select!
中等待.只有当我按下Ctrl+C时,程序才会退出.
我的 idea 是在父进程和子进程之间创建另一个通道,或者使用线程来运行子进程,但我不确定如何做到这一点.对如何实现这一点有什么 idea 吗?
我读到tokio
它可以解决这个问题,但我不太理解它,因为我只有2个月的经验与铁 rust .
Edit
Child
和get_child()
只是spawn
s a Command
的函数,并返回Child
对象.
我不能提供确切的代码,但最后一条指令是cmd.spawn()
,要运行的系统命令是一个可能会花费太多时间的程序.因此,我需要随时按Ctrl+C或等待它自动退出.