SA_RESTART specifically doesn't affect polling syscalls (the thing we
want to interrupt), but it prevents stupid things like having to check
for EINTR on recv/send (which we weren't doing anyway)
struct sigaction sa;
sa.sa_handler = on_sigint;
sigemptyset(&sa.sa_mask);
- sa.sa_flags = SA_RESETHAND; // only run it once
+ /* Note that SA_RESTART doesn't affect select/poll/epoll_wait. */
+ sa.sa_flags = SA_RESETHAND | SA_RESTART;
if (sigaction(SIGINT, &sa, NULL) == -1)
perror("sigaction");
sa.sa_handler = SIG_IGN;