Correct ba046c02c729c.
Apparently I had forgotten the counter-intuitive semantics of signalfd(): it's necessary to BLOCK the signals that will be handled exclusively by signalfd() so that the default POSIX signal handling mechanism won't intercept the signals first. The lack of response to ctrl+c is a legitimate bug that is now properly fixed; ba046c02c729c fixed that issue, but regressed the handling of other signals.
This commit is contained in:
parent
32bc422d0e
commit
f0340b1475
@ -166,7 +166,8 @@ static void setup_signals_ndhc(void)
|
||||
sigaddset(&mask, SIGUSR2);
|
||||
sigaddset(&mask, SIGCHLD);
|
||||
sigaddset(&mask, SIGTERM);
|
||||
if (sigprocmask(SIG_UNBLOCK, &mask, (sigset_t *)0) < 0)
|
||||
sigaddset(&mask, SIGINT);
|
||||
if (sigprocmask(SIG_BLOCK, &mask, (sigset_t *)0) < 0)
|
||||
suicide("sigprocmask failed");
|
||||
if (cs.signalFd >= 0) {
|
||||
epoll_del(cs.epollFd, cs.signalFd);
|
||||
@ -201,6 +202,9 @@ static int signal_dispatch(void)
|
||||
case SIGTERM:
|
||||
log_line("Received SIGTERM. Exiting gracefully.");
|
||||
exit(EXIT_SUCCESS);
|
||||
case SIGINT:
|
||||
log_line("Received SIGINT. Exiting gracefully.");
|
||||
exit(EXIT_SUCCESS);
|
||||
default: return SIGNAL_NONE;
|
||||
}
|
||||
}
|
||||
|
@ -77,7 +77,7 @@ int setup_signals_subprocess(void)
|
||||
sigaddset(&mask, SIGHUP);
|
||||
sigaddset(&mask, SIGINT);
|
||||
sigaddset(&mask, SIGTERM);
|
||||
if (sigprocmask(SIG_UNBLOCK, &mask, (sigset_t *)0) < 0)
|
||||
if (sigprocmask(SIG_BLOCK, &mask, (sigset_t *)0) < 0)
|
||||
suicide("sigprocmask failed");
|
||||
int sfd = signalfd(-1, &mask, SFD_NONBLOCK);
|
||||
if (sfd < 0)
|
||||
|
Loading…
x
Reference in New Issue
Block a user