in reply to Safe Pipe Opens and Implicit Loops

I agree. It seems to me that retrying should be the job of a module, not that of builtins.

Mind you, the behaviour is not new. It dates back to at least Perl 3.

system also has this loop, but it doesn't warn.
fork does not have this loop.

Instead of hooking into the warning, you could use alarm.

Or you could avoid the issue completely by using open3 (since it wraps fork).

my $pid = open3(*KID_TO_WRITE, '>&STDOUT', '>&STDERR', '-'); ... waitpid($pid, 0);

Replies are listed 'Best First'.
Re^2: Safe Pipe Opens and Implicit Loops
by martin (Friar) on Jul 11, 2010 at 20:51 UTC
    Instead of hooking into the warning, you could use alarm.

    No luck with that. At least on MacOS X, pending alarms seem to be postponed while open is doing its retry loop. Maybe the signal is needed for waiting between retries and other SIGALRM handlers are deactivated hence. I see them fire in both parent and child once fork is successful, but not during the retry loop, which does not help at all.

    To summarize, open3 seems to be the way to go, and I stand corrected in that the behaviour is not quite new.

      try enabling unsafe signals