Я пытаюсь прочитать именованный канал в Linux, используя Go.Обычно функция File.Read блокируется до тех пор, пока в канале нет доступных данных, но можно использовать относительно новую функцию File.SetReadDeadline, чтобы установить «тайм-аут» для чтения.
Я обнаружил,однако этот тайм-аут происходит только при первом чтении.Если я запускаю следующий код, сообщение «Тайм-аут, начало нового чтения» печатается только один раз, а вызов pipe.Read блокируется в следующий раз в цикле.(Это все еще работает, если я отправляю данные в канал, я получаю сообщение «получены».)
func Read(pipe *os.File) error {
for {
pipe.SetDeadline(time.Now().Add(5000 * time.Millisecond))
buff := make([]byte, 1024*64)
s, err := pipe.Read(buff)
if err == nil {
log.Printf("Received bytes of length %d", s)
} else if os.IsTimeout(err) {
log.Println("Timed out, starting new read")
} else {
log.Printf("Pipe error %s", err)
return err
}
}
}
В моих исследованиях похоже, что мне может понадобиться сбросить базовый контекст опроса (что бы это ни значило).) Есть ли способ заставить это работать, или это просто ошибка Go?