如何在铁锈中使用SIGALARM



我在rust中使用来自nix库的报警时遇到问题。我试图用警报来沟通两个子进程,练习包括每两秒钟向另一个子进程发送一个信号,然后用管道重新运行。当我运行代码时,它仍在等待,我看不到消息。这是我的代码:

use nix::sys::wait::wait;
use nix::unistd::ForkResult::{Child, Parent};
use nix::unistd::fork;
use nix::unistd::{alarm, pause};
use nix::sys::signal::*;
use std::io::prelude::*;
extern fn signal_handler(_: nix::libc::c_int) {}
fn set_alarm(sec: i32) {
alarm::set(sec.try_into().unwrap());
}
fn main() {
let (mut reader_2, mut writer_2) = os_pipe::pipe().unwrap();
unsafe { 
sigaction(
Signal::SIGALRM, 
&SigAction::new(
SigHandler::Handler(signal_handler), 
SaFlags::empty(), 
SigSet::empty())
).unwrap(); 
}
let pid = fork();
match pid.expect("Error during creating child") {
Parent { child } => {
drop(writer_2);
let pid_2 = fork();
match pid_2.expect("Error creating child 2") {
Parent { child } => {}
Child => {
let mut data: [u8;2] = [0;2];
for _ in 1..=10 {
set_alarm(2);
pause();
reader_2.read_exact(&mut data).unwrap();
println!("Data from C1, {}", std::str::from_utf8(&data).unwrap());
}
}
}
}
Child => {
drop(reader_2);
for _ in 1..=10 {
pause();
println!("here");
writer_2.write("C1".as_bytes()).unwrap();
}
}
}
wait().unwrap();
}

谢谢!!!

试试下面的补丁,看看是否有帮助。

读卡器将阻止从管道读取,因此读卡器上不需要pause

写入程序需要一些事件来每2秒触发一次,因此请使用写入程序中的警报来创建写入管道的触发事件。

这个触发器会唤醒读者,并显示作者在管道中写了什么。

我在使用wait方面有点弱,所以我改为使用waitpid

以下是我在补丁后观察到的输出:

signal_handler 14
after pause in child1
Data from C1, C1
signal_handler 14
after pause in child1
Data from C1, C1
. . .
--- main.rs 2022-11-04 20:15:22.000000000 -0700
+++ src/main.rs 2022-11-04 20:47:08.000000000 -0700
@@ -1,11 +1,13 @@
-use nix::sys::wait::wait;
+use nix::sys::wait::waitpid;
use nix::unistd::ForkResult::{Child, Parent};
use nix::unistd::fork;
use nix::unistd::{alarm, pause};
use nix::sys::signal::*;
use std::io::prelude::*;

-extern fn signal_handler(_: nix::libc::c_int) {}
+extern fn signal_handler(v: nix::libc::c_int) {
+   println!{ "signal_handler {}", v }; 
+}

fn set_alarm(sec: i32) {
alarm::set(sec.try_into().unwrap());
@@ -21,19 +23,16 @@
SaFlags::empty(), 
SigSet::empty())
).unwrap(); 
-    }
let pid = fork();
match pid.expect("Error during creating child") {
Parent { child } => {
drop(writer_2);
let pid_2 = fork();
match pid_2.expect("Error creating child 2") {
-                Parent { child } => {}
+                Parent { child } => { waitpid(child,None).unwrap(); }
Child => {
let mut data: [u8;2] = [0;2];
for _ in 1..=10 {
-                        set_alarm(2);
-                        pause();
reader_2.read_exact(&mut data).unwrap();
println!("Data from C1, {}", std::str::from_utf8(&data).unwrap());
}
@@ -44,11 +43,12 @@
Child => {
drop(reader_2);
for _ in 1..=10 {
+                set_alarm(2);
pause();
-                println!("here");
+                println!{ "after pause in child1" }; 
writer_2.write("C1".as_bytes()).unwrap();
}
}
}
-    wait().unwrap();
+    }
}

最新更新