I'm trying to programmatically listen to multiple signals and a ticking interval. To clear things up, here is the code I have currently:
use std::time::Duration;
use tokio::signal::unix::SignalKind;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut interval = tokio::time::interval(Duration::from_secs(5));
let sigrtmin = libc::SIGRTMIN();
let program_name = std::env::args().next().unwrap();
println!(
"Try executing this command:\nkill -{} $(pidof {})\n",
sigrtmin + 2,
program_name
);
let mut signal0 = tokio::signal::unix::signal(SignalKind::from_raw(sigrtmin))?;
let mut signal1 = tokio::signal::unix::signal(SignalKind::from_raw(sigrtmin + 1))?;
let mut signal2 = tokio::signal::unix::signal(SignalKind::from_raw(sigrtmin + 2))?;
let mut signal3 = tokio::signal::unix::signal(SignalKind::from_raw(sigrtmin + 3))?;
loop {
tokio::select! {
_ = signal0.recv() => {
println!("Got signal 0.");
}
_ = signal1.recv() => {
println!("Got signal 1.");
}
_ = signal2.recv() => {
println!("Got signal 2.");
}
_ = signal3.recv() => {
println!("Got signal 3.");
}
_ = interval.tick() => {
println!("Tick.");
}
}
}
}
So far, so good. But I just can't figure out how to programmatically (e.g. with a loop or a .collect()
) create new signals and listen for them in the select!
.
How would I go about doing that?