Golang中是否存在一种可移植的方法来检测连接到另一个进程的管道的os.Stdout在读取端被关闭而没有写入任何内容?我正在编写一个命令行帮助程序,如果它的stdout已关闭,则应退出,例如,由于连接到管道读取端的进程已退出。例如,从像这样的shell运行时:
go run my_helper.go | sleep 1
当睡眠进程退出以关闭管道的读取端时,助手应退出,而无需等待明确的终止信号或触发最终向标准输出非零写入的输入。
尽管我可以定期轮询stdout来编写零长度切片,但是Go似乎优化了零长度写入,在这种情况下什么也没做。即
n, err := os.Stdout.Write(nil)
即使在读取端关闭了os.Stdout,也会返回0, nil
。
由于代码只需要在Linux上运行,因此原则上我可以使用syscall.Select
解决此问题,并等待os.Stdout
上的写入错误,但是也许我错过了一些东西。