Есть ли в Golang портативный способ обнаружить, что os.Stdout, который подключен к каналу к другому процессу, был закрыт на конце чтения, не записав что-либо в него?Я пишу помощник командной строки, который должен завершиться, если его стандартный вывод был закрыт, потому что, например, завершился процесс, связанный с концом чтения канала.Например, при запуске из оболочки, подобной:
go run my_helper.go | sleep 1
, помощник должен выйти, когда процесс ожидания завершает работу, закрывая конец чтения канала без ожидания явного сигнала уничтожения или ввода, который запускает возможное ненулевое значениеwrite to stdout.
Хотя я мог бы просто периодически опрашивать stdout при записи срезов нулевой длины, но, похоже, Go оптимизировал запись нулевой длины и ничего не делал в таких случаях.Т.е.
n, err := os.Stdout.Write(nil)
возвращает 0, nil
, даже если os.Stdout был закрыт в конце чтения.
Поскольку код должен работать только в Linux, я могу обойти это в принципе, используя syscall.Select
и ждет ошибок записи на os.Stdout
, но, возможно, я что-то упустил.