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.