首页 > 解决方案 > 检测连接到管道的标准输出在golang的读取端关闭

问题描述

Golang 中是否有一种可移植的方式来检测连接到另一个进程的管道的 os.Stdout 在读取端关闭而不向其写入内容?我正在编写一个命令行助手,如果它的标准输出被关闭,它应该退出,因为例如,连接到管道读取端的进程退出了。例如,当从 shell 运行时:

go run my_helper.go | sleep 1

当睡眠进程退出关闭管道的读取端而不等待显式终止信号或触发最终非零写入标准输出的输入时,助手应该退出。

我虽然可以定期轮询 stdout 写入零长度切片,但似乎 Go 优化了零长度写入并且在这种情况下什么也没做。IE

n, err := os.Stdout.Write(nil)

0, nil即使 os.Stdout 在读取端关闭,也会返回。

由于代码只需要在 Linux 上运行,我原则上可以使用syscall.Select并等待写入错误来解决这个问题os.Stdout,但也许我错过了一些东西。

标签: go

解决方案


推荐阅读