diff --git a/src/libmain/shared.cc b/src/libmain/shared.cc index 31454e49d..0ee3fe772 100644 --- a/src/libmain/shared.cc +++ b/src/libmain/shared.cc @@ -194,9 +194,16 @@ void initNix() /* HACK: on darwin, we need can’t use sigprocmask with SIGWINCH. * Instead, add a dummy sigaction handler, and signalHandlerThread * can handle the rest. */ - struct sigaction sa; - sa.sa_handler = sigHandler; - if (sigaction(SIGWINCH, &sa, 0)) throw SysError("handling SIGWINCH"); + act.sa_handler = sigHandler; + if (sigaction(SIGWINCH, &act, 0)) throw SysError("handling SIGWINCH"); + + // Disable SA_RESTART for interrupts, so that system calls on this thread + // error with EINTR like they do on Linux, and we don’t hang forever. + act.sa_handler = SIG_DFL; + if (sigaction(SIGINT, &act, 0)) throw SysError("handling SIGINT"); + if (sigaction(SIGTERM, &act, 0)) throw SysError("handling SIGTERM"); + if (sigaction(SIGHUP, &act, 0)) throw SysError("handling SIGHUP"); + if (sigaction(SIGPIPE, &act, 0)) throw SysError("handling SIGPIPE"); #endif /* Register a SIGSEGV handler to detect stack overflows. */