从命名管道读取不会给出任何输出并无限期地阻塞代码

Posted

技术标签:

【中文标题】从命名管道读取不会给出任何输出并无限期地阻塞代码【英文标题】:Reading from a named pipe won't give any output and blocks the code indefinitely 【发布时间】:2020-06-06 03:52:58 【问题描述】:

我写了一段带有 IPC 目的的代码。预期的行为是代码从命名管道读取内容并打印字符串(使用Send("log", buff.String()))。首先,我在 goroutine 中打开命名管道“阅读器”,当阅读器打开时,我发送一个信号,表明数据可以写入命名管道(使用 Send("datarequest", ""))。代码如下:

var wg sync.WaitGroup
wg.Add(1)

go func() 
    //reader part
    file, err := os.OpenFile("tmp/"+os.Args[1], os.O_RDONLY, os.ModeNamedPipe)
    if err != nil 
        Send("error", err.Error())
    

    var buff bytes.Buffer
    _, err = io.Copy(&buff, file)

    Send("log", buff.String())

    if err != nil 
        Send("error", err.Error())
    

    wg.Done()
()

Send("datarequest", "")
wg.Wait()

这是发送信号时执行的代码:

    //writer part
    file, err := os.OpenFile("tmp/" + execID, os.O_WRONLY, 0777)

    if err != nil 
        c <- "[error] error opening file: " + err.Error()
    

    bytedata, _ := json.Marshal(moduleParameters)
    file.Write(bytedata)

所以当我尝试复制代码时,我得到它的行为是无限期地阻塞。我真的不知道为什么会这样。当我在终端中使用 cat 进行测试时,我确实得到了预期的结果,所以我的问题是如何使用代码获得相同的结果?

编辑

execID与os.Args[1]相同

【问题讨论】:

哦,那是字符串类型我不知道为什么我做了两次 【参考方案1】:

作者应在使用file.Close() 发送完成后关闭文件。注意file.Close() 可能会返回错误。

【讨论】:

以上是关于从命名管道读取不会给出任何输出并无限期地阻塞代码的主要内容,如果未能解决你的问题,请参考以下文章

命名管道不会等到在 bash 中完成

从命名管道读取的 C 不会结束

从命名管道并发选择

Java中的命名管道和多线程

C、是不是可以阻塞进程直到管道再次打开?

使用命名管道模拟流程替换