Как проверить, пуст ли буфер stdin в TCL? - PullRequest
2 голосов
/ 06 января 2012

С помощью fconfigure вы можете получить и установить параметры канала. -buffering указывает тип буферизации, и по умолчанию это line для stdin.

Есть ли способ проверить, пуст ли буфер в stdin или нет?


Пожалуйста, посмотрите этот вопрос: Как проверить, ожидает ли stdin в TCL?

Ответы [ 3 ]

2 голосов
/ 06 января 2012

Очевидно, что вы можете установить режим канала неблокирующим и читать с него.Если чтение возвращает 0 длины, то ничего не было доступно.Тем не менее, я подозреваю, что вы хотите проверить наличие данных, но не полную строку, если вы упомянули там буферизацию строки.Команда fblocked проверяет канал для этого.Подробности см. fblocked (1) , но для канала с буферизацией строки это позволяет узнать, что присутствует неполная строка.

Еще одна полезная команда при чтении стандартного ввода, если вы читаете интерактивный скриптКоманда должна использовать команду info complete.При этом вы можете просто накапливать строки до тех пор, пока info complete не вернет true, а затем оценить весь буфер в одном.

0 голосов
/ 30 апреля 2015

Я знаю, что это старый вопрос, но он вызвал некоторые исследования с моей стороны, и я нашел функцию с именем fileevent, которая вызывает обработчик событий, когда в потоке, то есть в stdin, есть что-то, что может быть прочитано. Это может быть полезно.

Источник: http://wiki.tcl.tk/880

0 голосов
/ 06 января 2012

Вы можете проверить входной Tcl буфер с помощью chan pending input stdin (требуется по крайней мере Tcl 8.5). Это не указывает, имеет ли ОС что-либо в своих буферах; они проверяются при попытке прочитать данные (gets или read) или с помощью сценария, который запускает чтение fileevent, когда присутствует хотя бы один байт. (Что ж, строго то, что фактически обещано, так это то, что попытка чтения одного байта не будет блокирована, но это может быть из-за ошибки, которая вызывает немедленный сбой. Это семантика того, как работает готовность дескриптора файла на уровне ОС.)

Опция -buffering влияет только на выходные каналы; он бесполезен на stdin (или любом другом канале, доступном только для чтения) и не имеет никакого эффекта. В самом деле. (Это, однако, слишком много проблем, чтобы удалить.)

...