尝试编写命名管道时如何修复"Broken Pipe"错误?



我正在rust中尝试命名管道,我想创建一个服务器,从客户端接收永不终止的消息。

//reciever.rs
use libc::{c_char, mkfifo};
use std::ffi::CString;
use std::fs::OpenOptions;
use std::io::Read;
fn main() {
let _ = std::fs::remove_file("rust-fifo");
let name_fifo = CString::new("rust-fifo").unwrap();
let name_fifo: *const c_char = name_fifo.as_ptr() as *const c_char;
if unsafe { mkfifo(name_fifo, 0o644) } != 0 {
panic!("Error creating fifo.")
}
loop {
let mut file = OpenOptions::new().read(true).open("rust-fifo").unwrap();
let mut buffer = Vec::new();
file.read_to_end(&mut buffer).unwrap();
//println!("{:#?}", &buffer);
println!("{}", String::from_utf8(buffer).unwrap());
}
}
//sender.rs
use std::{fs::OpenOptions, io::Write};
fn main() {
loop {
let mut file = OpenOptions::new().write(true).open("rust-fifo").expect("error opening the file");
file.write_all(b"hello").expect("error writing the file");//ERROR HERE "BROKEN PIPE"
}
}

receiver.rs收到一些消息,但sender.rs抛出错误,当不使用循环时,一切都很好,但我想拥有一个永不结束的客户端,这就是错误,为什么会发生?

thread 'main' panicked at 'error writing the file: Os { code: 32, kind: BrokenPipe, message: "Broken pipe" }', src/bin/sender.rs:6:34
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

为什么会发生这种情况?

broken pipe意味着:您试图写入(当前(具有没有读者。

在接收器中,您不断地关闭和重新打开FIFO。如果发送方尝试在接收方closeopen之间进行写入,则会从write(2)得到EPIPE错误。

所以不要这样做——打开FIFO一次并继续从中读取消息。

相关内容

最新更新