I found out why alarm/SIGALRM wasn't working. Safe signals! I needed to add a signal check to MacPerl's PERL_ASYNC_CHECK ... essentially just a if (PL_sig_pending) { despatch_signals() }. The signals were never being raised. I was about to define PERL_OLD_SIGNALS when I looked around and saw its mention in mg.c:Perl_csighandler, and followed the trail to Perl_raise_signal and beyond.