As others suggested the first thing to do would be to turn buffering off.
Then simply check the pid is alive before every write.
Which is essentially what you have suggested: to check if filehandle is open, but at a lower level, that of the process.
A tiny caveat would be if your user does not have permission to check whether a pid is alive. I think that's unlikely in unix. For Windows you can always install one of the thousand viruses out there to hijack the system and bypass whatever permissions. Kids don't do this - someone else will do it for you (that's a joke)
my $other_program = 'cat'; my $pid = open my $pipe, " | $other_program "; print $pipe "blahblah" if alive($pid);
I thought something as simple as this: sub alive { return kill 0, $_[0] } would work but it doesn't in my Fedora-linux-latest. It always return true!
If you are on a unix box, then it would be straightforward to check the pid using various methods (e.g. ps -o pid | grep -w $pid or in linux: via perl: -d "/proc/$pid". Additionally, relevant modules on CPAN do exist. It's unclear to me if they work for non-unix systems so I wont mention them here.
bw, bliako
In reply to Re: Detect whether a writeable filehandle has closed?
by bliako
in thread Detect whether a writeable filehandle has closed?
by jdporter
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |