in reply to Setting signal handlers considered unsafe?

I believe this is a problem with catching the parent in middle of setting the handler. You're manipulating the value of SIG{ALRM}, this operation (line 9) is more than probably not atomic. At the same time, you're trying to access this handler by sending a signal. The value is not well defined at this time and you get punished.

SPECULATION: Perhaps perl first sets the handler to default, then creates a new handler structure (I don't know perl guts, but there's gonna be something like that) and then assigns it.

By sending the signals not that often, like by changing the 1 while kill to sleep 1 while kill you get a chance that you catch the parent in a less vulnerable state and one of your handlers gets executed. Try running it a few times.

and BTW, setting the global SIG{ALRM} instead of the local in f, it _does_ start to work, at least on my system (Fedora 8, perl 5.8.8)