multitee and its documentation were
by Dan Bernstein.
multitee [ -bsize ] [ -vQq ] [ fd-fd,fd,fd... ] ...
multitee sends multiple inputs to multiple outputs. Given an
argument of the form “
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
,fdout are equivalent. If there is an
error of any sort (including
SIGPIPE) in writing to
multitee prints a warning on stderr and
fdout entirely. (This doesn't affect reads on
-fdout is replaced by
:fdout then multitee will exit upon any
from that descriptor.
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.
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
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
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
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
multitee has several flags:
multitee, this version does not require output buffers, and does not copy bytes anywhere between
multiteewill 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
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
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