In an interesting c.l.t posting, Colin Macleod describes what it takes to make a Unix FIFO (first in, first out) or named piped event-based:
I happen to be working on a project just now where I want to have an event-driven Tcl process read from a fifo. (This is on Solaris 2.6, in case it makes a difference.) My first attempts suggested that this could only be done by polling, but after digging around more I found that I could get fileevent to work as follows:
proc readpipe pipe { set data [read $pipe] ... process $data ... } ### Open the fifo, set up event-driven input from it. proc open_pipe pipename { exec /bin/sh -c "sleep 10 > $pipename" & set pipe [open $pipename r] fconfigure $pipe -blocking 0 fileevent $pipe readable [list readpipe $pipe] set dummy [open $pipename w] after 20000 {exec /bin/true}; # to get zombie sleep reaped }
The tricky bits are:
Without suggesting that it is 100% bulletproof, this works fairly well:
## ******************************************************** ## ## Name: fifo ## ## Description: ## Provide an anonymous fifo using cat. ## ## Parameters: ## ## Usage: ## trivial handler example: ## ## proc handle { fifo } { ## puts -nonewline [ gets $fifo ] ## } ## ## set fifo [ fifo handle ] ## puts $fifo peep! ## ## Comments: ## The input side of the fifo should never be flushed! ## The fifo can be closed like an ordinary file. proc fifo { { handler "" } } { if { [ catch { set fifo [ open |cat a+ ] fconfigure $fifo -blocking off fconfigure $fifo -buffering none if { [ string length $handler ] } { fileevent $fifo readable "$handler $fifo" } } err ] } { return -code error "[ myName ]: $err" } set fifo } ## ********************************************************
(Explain how general file append operations can be detected as events only through polling.)
An example of which can be seen in tailf
[ Category Interprocess Communication | Category Channel | Category Acronym ]