Version 11 of pipe

Updated 2004-12-02 22:05:49

pipe ?fileId_var_r ?fileId_var_w

Create a pipe. If fileId_var_r and fileId_var_w are specified, then pipe will set the a variable named fileId_var_r to contain the fileId of the side of the pipe that was opened for reading, and fileId_var_w will contain the fileId of the side of the pipe that was opened for writing.

If the fileId variables are not specified, then a list containing the read and write fileIdw is returned as the result of the command.

There is a proposal tclx file commands for core [seems like something is missing here...]


[We also could talk about the abstract notion of "pipe", and how it comes up in conversation far more than just its use in reference to this command.]


Can somebody give an example for this? My attempt to use

 package require Tclx
 pipe rpipe wpipe;
 puts $wpipe "test\n";
 read $wpipe

simply leads to a lock up. Any help appreciated ;).


The problem is that read tries to read to the end of file. Since a pipe does not have an end of file indication ( unless one of the ends is closed) read never returns. An example with gets and an example with read are given below. In both the gets and read examples you must flush the pipe before anything will show up on the read end.

 package require Tclx
 pipe rpipe wpipe;
 puts $wpipe "test"
 flush $wpipe
 puts "[gets $rpipe]"

For the read example a larger the capture size given to the read command will make it less likely you will have to loop more than once. Also critical to using read was using fconfigure to make the read pipe non-blocking.

 package require Tclx
 pipe rpipe wpipe;
 fconfigure $rpipe -blocking 0 
 puts $wpipe "test"
 flush $wpipe
 set buff ""
 set done 0 
 while { !$done } {
    set appstr [ read $rpipe 1000 ]
    append buff $appstr
    if { [ string length $appstr ] != 1000 } {
        set done 1;
    } 
 }
 puts "$buff"

Category Command for TclX package.