Have you tried turning off the CLOEXEC flag?
my $socket = new IO::Socket::INET(@_) or die;
$socket->fcntl(F_SETFD, 0) or die; # clear CLOEXEC
# $socket->fcntl(F_SETFD, FD_CLOEXEC); # set CLOEXEC
It's also probably a good idea to ->shutdown the sockets once you're done, especially if they may "leak" to some other thread or process.
ps. I've not the foggiest idea what serially bi-directional could mean. AFAIK streams are full-duplex, with separate receive and send queues, and usually have an out-of-band (OOB) mechanism too (e.g. telnet uses this to signal interrupt).