go - 从命名管道读取不会给出任何输出并无限期地阻塞代码
问题描述
我写了一段带有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] 相同
解决方案
作家应该在完成发送后使用file.Close()
. 请注意,file.Close()
可能会返回错误。
推荐阅读
- typescript - “从不”类型上不存在属性。在一个函数中
- python-3.x - 我可以在 DRF 中创建一个令牌池吗
- flutter - Flutter ListTile onTap 函数不会重定向到新页面
- flutter - 在颤振中使用 SliverList 的 SliverChildBuilderDelegate 时索引来自哪里
- c# - 抑制触发的 Blazor 输入事件
- c++ - 优化循环以获得更好的性能
- image-recognition - Yolov3的显卡内存可以通过使用质量较低的图像来减少吗?
- html - HTML 选框问题
- python - 在 Pandas 中解析带有 JSON 时差的 DateTime
- java - c服务器/java客户端之间的通信问题