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

Posted

技术标签:

【中文标题】尝试编写命名管道时如何修复“Broken Pipe”错误?【英文标题】:How to fix "Broken Pipe" error when trying to write a named pipe? 【发布时间】:2021-12-26 00:56:06 【问题描述】:

我正在尝试使用 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

【问题讨论】:

【参考方案1】:

为什么会这样?

broken pipe 表示:您尝试写入(当前)具有 没有读者。

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

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

【讨论】:

非常感谢,很有道理,我会努力实现的!

以上是关于尝试编写命名管道时如何修复“Broken Pipe”错误?的主要内容,如果未能解决你的问题,请参考以下文章

java.io.IOException: Broken pipe

java.sql.SQLException: Io 异常: Broken pipe 如何在不重启的情况下恢复?

使用 Ktor HttpClient(CIO) websocket 发送内容时如何捕获 Broken pipe 异常?

套接字:send() 函数返回“Broken Pipe”错误

Python CGI 脚本 IOError Broken Pipe

如何修复错误“命名管道提供程序,错误 40 - 无法打开与“SQL Server”的连接?