我正在嘗試使用 fork() 創建子行程并通過管道進行通信。我正在使用 nix 庫和 os_pipe。當我嘗試執行程式時,它正在等待,我看不到我在子行程中發送給父行程的訊息。我嘗試使用 drop 功能關閉管道但不起作用。這是我的代碼:
use nix::sys::wait::wait;
use nix::unistd::ForkResult::{Child, Parent};
use nix::unistd::{fork, getpid, getppid, pipe};
use std::io::prelude::*;
fn main() {
let pid = fork();
let (mut reader, mut writer) = os_pipe::pipe().unwrap();
match pid.expect("Error during creating child") {
Parent { child } => {
println!("From parent, {}", getpid());
wait().unwrap();
let mut data = String::new();
reader.read_to_string(&mut data).unwrap();
println!("data: {}", data);
}
Child => {
println!("from child, {}", getpid());
writer.write_all("hello".as_bytes()).unwrap();
}
}
}
謝謝!!!
uj5u.com熱心網友回復:
首先,您呼叫fork()然后創建管道。一旦fork()回傳,就會有兩個程序(認為好像fork()回傳兩次)。這意味著每個行程創建一個單獨的管道對,彼此無關。只需交換這兩行,這樣就只有一個共享管道(你也忘記了unsafe):
let (mut reader, mut writer) = os_pipe::pipe().unwrap();
let pid = unsafe { fork() };
然后,在分叉之后,管道的每一端都有兩個副本,但是由于父級只做讀取,而子級只做寫,你應該關閉(drop)未使用的端:
match pid.expect("Error during creating child") {
Parent { child } => {
drop(writer);
//...
}
Child => {
drop(reader);
//...
}
如果您未能在父級中關閉寫入器,即使子級結束,管道仍將打開進行寫入,父級永遠不會到達管道的末端,read_to_string()也永遠不會完成。這里drop(reader)實際上不需要,但無論如何這是一個好習慣:孩子可以使用寫入管道失敗來檢測父母已經死亡。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/517275.html
標籤:linux锈锈货
