gpt4 book ai didi

go - 如何在命名管道中的 EOF 后恢复读取

转载 作者:IT王子 更新时间:2023-10-29 01:15:02 27 4
gpt4 key购买 nike

我正在编写一个打开命名管道进行读取的程序,然后处理写入该管道的任何行:

err = syscall.Mkfifo("/tmp/myfifo", 0666)
if err != nil {
panic(err)
}

pipe, err := os.OpenFile("/tmp/myfifo", os.O_RDONLY, os.ModeNamedPipe)
if err != nil {
panic(err)
}

reader := bufio.NewReader(pipe)
scanner := bufio.NewScanner(reader)

for scanner.Scan() {
line := scanner.Text()
process(line)
}

只要写入过程不重新启动或由于其他原因发送 EOF,这就可以正常工作。发生这种情况时,循环终止(正如 Scanner 的规范所预期的那样)。

但是,我想保持管道打开以接受进一步的写入。我可以当然只是重新初始化扫描器,但我相信这会造成竞争条件,在新进程开始写入管道时扫描器可能还没有准备好。

还有其他选择吗?我是否需要直接使用 File 类型?

最佳答案

来自bufio GoDoc :

Scan ... returns false when the scan stops, either by reaching the end of the input or an error.

因此您可以让文件保持打开状态并读取直到 EOF,然后在文件更改时或以固定间隔(即制作一个 goroutine)再次触发 scanner.Scan(),然后制作确保 pipe 变量没有超出范围,以便您可以再次引用它。

如果我正确理解了您对竞争条件的担忧,这将不是问题(除非写入和读取操作必须同步)但是当扫描器重新初始化时它会回到文件的开头.

关于go - 如何在命名管道中的 EOF 后恢复读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43026773/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com