I finally switched to mpm_event, which caused me to no longer get signals constantly, but until then I was seriously running a patched copy of Python to work around this issue; an issue, by the way, which was reported at the beginning of 2007, and only fixed midway through 2010. :(
http://bugs.python.org/issue1628205
The general idea, however, is that if you are using a low-level primitive, one that nigh unto maps directly to a system call (as opposed to urlopen ;P), then you actually "want" (supposedly) EINTR to not be handled for you, as it might be your intention to use it to do something valuable (just as you might from a C program).
while (PerlLIO_close(fd) != 0) {
if (errno != EINTR) {
code = -1;
break;
}
/* EINTR */
if (PL_sig_pending && S_perlio_async_run(aTHX_ f))
return -1;
}
[1] https://github.com/mirrors/perl/blob/be48bbe8d671b6841c3ec7c...In CPython's case, as far as I can tell, it uses bare, unchecked close() calls, and just assumes they succeed.
(It does, however, provide an interface for dealing with signals, and one of the capabilities, as of 2.6, is to specify whether system calls will restart. See some discussion on SA_RESTART elsewhere in these comments.)