multitee
program
multitee
and its documentation were
originally written
by Dan Bernstein.
multitee [ -bsize ] [ -vQq ] [ fd-fd,fd,fd... ] ...
multitee
sends multiple inputs to multiple outputs. Given an
argument of the form “fdin-fdout,fdout,fdout...
”, it
will send all input on file descriptor fdin
to each descriptor
fdout
. It will exit when all fdin
are closed.
Several arguments may specify outputs from the same fdin
.
-fdout
and ,fdout
are equivalent. If there is an
error of any sort (including SIGPIPE
) in writing to
fdout
, multitee
prints a warning on stderr and
forgets fdout
entirely. (This doesn't affect reads on
fdin
.) If -fdout
is replaced by
:fdout
then multitee will exit upon any SIGPIPE
s
from that descriptor.
Furthermore, efd
means that as soon as
fdin
reaches end of file, fd
is considered to reach
EOF as well. multitee
will warn about any input errors and then
treat them like EOF.
Unlike tee
, multitee
tries its best to continue
processing all descriptors even while some of them are blocked. However, it
will get stuck reading if another process is reading the descriptor and grabs
the input first; it will get stuck writing if an input packet does not fit in
an output pipe. (If the output descriptor has NDELAY
set, and
multitee
receives EWOULDBLOCK
, it writes one byte
at a time to avoid pipe synchronization problems.) While it is tempting to
set the descriptors to non-blocking mode, this is dangerous: other processes
using the same open file may not be able to deal with NDELAY
.
It is incredible that none of the major UNIX vendors or standards committees
has come up with true per-process non-blocking I/O. (Under BSD 4.3 and its
variants, multitee
could send timer signals to itself rapidly to
interrupt any blocking I/O. However, this cannot work under BSD 4.2, and is
generally more trouble than it's worth.) A program can set
NDELAY
before invoking multitee if it knows that no other
processes will use the same open file.
multitee
will also temporarily stop reading an input descriptor
if more than 8192 bytes are pending on one of its output descriptors. This
does not affect independent fdin
-fdout
pairs.
multitee
has several flags:
multitee
, this version does not
require output buffers, and does not copy bytes anywhere
between read()
and write()
.multitee
will not use stderr in any way (except,
of course, if descriptor 2 is specified in an argument).multitee 0-1,4,5 4> foo 5> bar
Same as “tee foo bar
” except for better
blocking behavior.
multitee 0:1 3:1 4:1,2 6:7
Merge several sources into the output, meanwhile copying 6 to 7 and recording 4's input in 2.
tcpclient servermachine smtp multitee 0:7 6:1e0
Same as mconnect
on Suns. The e0
tells multitee to
quit as soon as the network connection closes.
multitee
expects all descriptors involved to be open. Currently
a closed descriptor acts like an open descriptor which can never be written
to.