Skip to content
This repository was archived by the owner on Jul 14, 2019. It is now read-only.

Commit 0d011b7

Browse files
author
Lior Amram
committed
catch SIGTERM via signalfd
1 parent adcef4d commit 0d011b7

File tree

1 file changed

+19
-8
lines changed

1 file changed

+19
-8
lines changed

src/daemonize.c

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ static const char *_get_exit_reason(siginfo_t *info) {
110110
return "UNKNOWN";
111111
}
112112

113-
static void _handle_sig_child(void) {
113+
static void _handle_signals(void) {
114114
struct signalfd_siginfo sfd_info;
115115
for (;;yield()) {
116116
for (;;) {
@@ -124,6 +124,10 @@ static void _handle_sig_child(void) {
124124
LOGGER_ERROR("failed to read from signal fd, incorrect size");
125125
continue;
126126
}
127+
if (SIGTERM == sfd_info.ssi_signo) {
128+
LOGGER_INFO("ribs daemon: exiting...");
129+
epoll_worker_exit();
130+
}
127131
memset(&last_sig_info, 0, sizeof(last_sig_info));
128132
epoll_worker_ignore_events(sigfd);
129133
for (;;) {
@@ -183,7 +187,7 @@ static void signal_handler(int signum) {
183187
LOGGER_INFO("ignoring SIGINT in child process");
184188
break;
185189
}
186-
case SIGTERM:
190+
LOGGER_INFO("received SIGINT");
187191
epoll_worker_exit();
188192
break;
189193
default:
@@ -192,22 +196,29 @@ static void signal_handler(int signum) {
192196
}
193197

194198
static int _set_signals(void) {
195-
struct sigaction sa = {
196-
.sa_handler = signal_handler,
197-
.sa_flags = 0
198-
};
199-
sigaction(SIGTERM, &sa, NULL);
199+
static char altstack[SIGSTKSZ];
200+
static stack_t ss;
201+
memset(&ss, 0, sizeof(ss));
202+
ss.ss_sp = altstack;
203+
ss.ss_size = SIGSTKSZ;
204+
if (0 > sigaltstack(&ss, NULL))
205+
return LOGGER_PERROR("sigaltstack"), -1;
206+
207+
struct sigaction sa;
208+
memset(&sa, 0, sizeof(sa));
209+
sa.sa_handler = signal_handler;
200210
sigaction(SIGINT, &sa, NULL);
201211

202212
sigset_t sigset;
203213
sigemptyset(&sigset);
204214
sigaddset(&sigset, SIGCHLD);
215+
sigaddset(&sigset, SIGTERM);
205216
if (0 > sigprocmask(SIG_BLOCK, &sigset, NULL))
206217
return LOGGER_PERROR("sigprocmask"), -1;
207218
sigfd = signalfd(-1, &sigset, SFD_NONBLOCK | SFD_CLOEXEC);
208219
if (0 > sigfd)
209220
return LOGGER_PERROR("signalfd"), -1;
210-
if (NULL == (sigfd_ctx = ribs_context_create(SIG_CHLD_STACK_SIZE, 0, _handle_sig_child)))
221+
if (NULL == (sigfd_ctx = ribs_context_create(SIG_CHLD_STACK_SIZE, 0, _handle_signals)))
211222
return -1;
212223
return 0;
213224
}

0 commit comments

Comments
 (0)