提交 99590965 authored 作者: Travis Cross's avatar Travis Cross

Handle signals better with -reincarnate

If we receive SIGTERM or SIGILL we should propagate the signal to the
child FS process.  As FS normally handles these signals, we need to
restore the handler before we refork.

FS may also add a handler for SIGCHLD; we need the default action
here instead for the parent.
上级 9fc3990e
...@@ -357,11 +357,25 @@ static void daemonize(int *fds) ...@@ -357,11 +357,25 @@ static void daemonize(int *fds)
return; return;
} }
static pid_t reincarnate_child = 0;
static void reincarnate_handle_sigterm (int sig) {
if (!sig) return;
if (reincarnate_child) kill(reincarnate_child, sig);
return;
}
static void reincarnate_protect(char **argv) { static void reincarnate_protect(char **argv) {
int i; int i; struct sigaction sa, sa_dfl, sa4_prev, sa15_prev, sa17_prev;
memset(&sa, 0, sizeof(sa)); memset(&sa_dfl, 0, sizeof(sa_dfl));
sa.sa_handler = reincarnate_handle_sigterm;
sa_dfl.sa_handler = SIG_DFL;
refork: refork:
if ((i=fork())) { /* parent */ if ((i=fork())) { /* parent */
int s; pid_t r; int s; pid_t r;
reincarnate_child = i;
sigaction(SIGILL, &sa, &sa4_prev);
sigaction(SIGTERM, &sa, &sa15_prev);
sigaction(SIGCHLD, &sa_dfl, &sa17_prev);
rewait: rewait:
r = waitpid(i, &s, 0); r = waitpid(i, &s, 0);
if (r == (pid_t)-1) { if (r == (pid_t)-1) {
...@@ -375,6 +389,9 @@ static void reincarnate_protect(char **argv) { ...@@ -375,6 +389,9 @@ static void reincarnate_protect(char **argv) {
exit(WEXITSTATUS(s)); exit(WEXITSTATUS(s));
} }
if (WIFEXITED(s) || WIFSIGNALED(s)) { if (WIFEXITED(s) || WIFSIGNALED(s)) {
sigaction(SIGILL, &sa4_prev, NULL);
sigaction(SIGTERM, &sa15_prev, NULL);
sigaction(SIGCHLD, &sa17_prev, NULL);
if (argv) { if (argv) {
execv(argv[0], argv); return; execv(argv[0], argv); return;
} else goto refork; } else goto refork;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论