test_subprocess's test_send_signal assumes SIGINT is not being ignored, by spawning a new process and expecting it to have the default SIGINT handler . SIGINT can be set to SIG_IGN if the process running the test inherited it from the parent process.
Patch attached to (briefly) set signal.SIGINT to the default in the test. It may make sense to add a feature to subprocess.Popen to ignore/unignore signals (it should only need to support SIG_DFL and SIG_IGN, not other signal handlers, considering there'll be an exec right after.)
No, using preexec_fn leaves all kinds of races when mixing threads and processes (which is a bad idea, but people still sometimes do.) And no, restore_signals doesn't fix this; restore_signals only resets the signals the *Python interpreter itself* ignored: SIGFPE, SIGXFZ and SIGFSZ (and it defaults to True anyway.) It doesn't affect other signals at all, even if Python code ignored them.