I thought that managing a pipe for each child would be unruly, but your example provided me with the information I needed. Specifically maintaining a hash of pipes associated to each child PID was what I was looking for. IO::Pipe provided the handle reference I needed to do that.
How could I have taken a reference to a FILEHANDLE like:
pipe( READER, WRITER );
$pipes{$pid} = [\*READER, \*WRITER];
Would that be the same thing as using IO::Pipe?