This might very well be a race condition. If the reader process tries to
read() from the pipe before a writer opens it, the
read() will fail with an
EOF condition.
To avoid this scenario, open two filedescriptors in the parent, before the fork(). After the fork() close the appropiate end of the pipe. This code will probably do what you want:
#!/usr/bin/perl -w
use strict;
# Lots of nice code here...
open RFIFO, "< $ENV{HOME}/.fifopipe"
or die "Cannot open read pipe: $!\n";
open WFIFO, "> $ENV{HOME}/.fifopipe"
or die "Cannot open write pipe: $!\n";
if (fork()) { # Parent
close WFIFO;
# Your parent code, which can now safely block on
# <RFIFO>
}
else { # Child
close RFIFO;
# Your child code, which can take its time to write()
# to the pipe.
exit 0;
}
Hope this helps.