a part of stdio, this file is opened by default for each application making use of the stdio package of code.
This input file may correspond to a disk file, pipe, terminal device, or other construct.
To refer to the stdin filehandle in Tcl, use the string stdin when using gets .
A quite distinct use of the same word refers to the stdin package Stephen Uhler includes with tclhttpd.
An example of reassigning stdin and providing a prompt and capturing user input for tclsh.
#!/usr/bin/tclsh # by Mike Tuxford # # the handler for stdin proc localHandler {} { # get the data from stdin gets stdin data # client will exit if you type "exit". How original! if {$data == "exit"} { exit } else { # process your data here, or pass it to another proc # or pass it to a local/remote server # return a new pseudo-prompt puts -nonewline stdout \ "[clock format [clock seconds] -format "%H:%M:%S"] Tcl> " flush stdout } return } # assign our event handler for stdin fileevent stdin readable localHandler # send a startup message and initial prompt puts -nonewline stdout \ "Tcl pseudo-prompt activated... \ \n[clock format [clock seconds] -format "%H:%M:%S"] Tcl> " flush stdout # enter the tcl event loop vwait __forever__
You can even use it with inetd for an instant TCP/IP server:
in your services file:
test 10000/tcp
in your /etc/inetd.conf:
test stream tcp /home/user/develop/program.tcl program.tcl
Then in your program just read stdin like above and that's it!
SB: Turn off buffering on stdout to use repetitive -nonewline in interactive input with tclsh:
fconfigure stdout -buffering none puts -nonewline "Give me your input: " gets stdin first puts -nonewline "Give me another input: " gets stdin second puts "First you told me $first and then $second"