Как проверить, читается ли stdin в TCL? - PullRequest
1 голос
/ 05 января 2012

С помощью следующей команды вы можете зарегистрировать обратный вызов для stdin:

fileevent stdin readable thatCallback

Это означает, что во время выполнения команды обновления он будет оценивать thatCallback время от времени, пока есть доступный ввод в stdin.

Как я могу проверить, доступен ли ввод на stdin?

Ответы [ 2 ]

3 голосов
/ 05 января 2012

Вы просто читаете / получаете от stdin внутри вашего обратного вызова. В основном шаблон выглядит как этот фрагмент из примера fileevent от Кевина Кенни :

proc isReadable { f } {
  # The channel is readable; try to read it.
  set status [catch { gets $f line } result]
  if { $status != 0 } {
    # Error on the channel
    puts "error reading $f: $result"
    set ::DONE 2
  } elseif { $result >= 0 } {
    # Successfully read the channel
    puts "got: $line"
  } elseif { [eof $f] } {
    # End of file on the channel
    puts "end of file"
    set ::DONE 1
  } elseif { [fblocked $f] } {
    # Read blocked.  Just return
  } else {
    # Something else
    puts "can't happen"
    set ::DONE 3
  }
}
# Open a pipe
set fid [open "|ls"]

# Set up to deliver file events on the pipe
fconfigure $fid -blocking false
fileevent $fid readable [list isReadable $fid]

# Launch the event loop and wait for the file events to finish
vwait ::DONE

# Close the pipe
close $fid
0 голосов
/ 05 января 2012

Если вы посмотрите на ответ на этот вопрос, вы увидите, как использовать fconfigure для перевода канала в неблокирующий режим.В этом руководстве по Tcl содержится гораздо более подробная информация, вам нужно посмотреть страницу руководства fconfigure вместе со страницей руководства vwait.

...