我在使用 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();
}
謝謝!!!
uj5u.com熱心網友回復:
試試下面的補丁,看看是否有幫助。
閱讀器將阻止從管道讀取,因此閱讀器上不需要 a 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();
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/529287.html
標籤:linuxUnix锈锈货
