Обнаружить стандартный вывод, подключенный к каналу был закрыт на конце чтения в Голанге - PullRequest
0 голосов
/ 25 июня 2018

Есть ли в 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, но, возможно, я что-то упустил.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...