Команда gets
(когда передается переменная для получения строки) возвращает отрицательное число, когда она находится в состоянии незначительной ошибки.Существует два таких условия:
- Когда канал достиг конца файла. После команда
gets
, eof
(примененная к каналу) сообщит об истинном значении в этом случае. - Когда канал заблокирован, т.е.когда он имеет несколько байтов, но не завершенную строку (Tcl имеет внутреннюю буферизацию для обработки этого; вы можете получить число ожидающих байтов с помощью
chan pending
).Вы видите это только когда канал находится в неблокирующем режиме (потому что в противном случае gets
будет ждать бесконечно).В этом случае команда fblocked
(применяемая к каналу) вернет true.
Условия серьезных ошибок (например, закрытие канала) приводят к ошибкам Tcl.
Если другая команда производит только частичный вывод или делает что-то странное с буферизацией, вы можете получить вечно заблокированный конвейер.Это более вероятно для двунаправленного канала, такого как вы используете, так как команда Certify
, вероятно, ожидает, когда вы закроете другой конец.Вы можете использовать его только для чтения?Существует много сложностей для правильного взаимодействия с процессом в двух направлениях!(Например, вы, вероятно, хотите, чтобы режим буферизации output канала был небуферизованным, fconfigure $pipeline -buffering none
.)