summaryrefslogtreecommitdiffstats
path: root/src/daemon/signals.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/daemon/signals.c')
-rw-r--r--src/daemon/signals.c83
1 files changed, 7 insertions, 76 deletions
diff --git a/src/daemon/signals.c b/src/daemon/signals.c
index c014452b7..4e4d7c4d4 100644
--- a/src/daemon/signals.c
+++ b/src/daemon/signals.c
@@ -2,6 +2,12 @@
#include "common.h"
+/*
+ * IMPORTANT: Libuv uv_spawn() uses SIGCHLD internally:
+ * https://github.com/libuv/libuv/blob/cc51217a317e96510fbb284721d5e6bc2af31e33/src/unix/process.c#L485
+ * Extreme care is needed when mixing and matching POSIX and libuv.
+ */
+
typedef enum signal_action {
NETDATA_SIGNAL_END_OF_LIST,
NETDATA_SIGNAL_IGNORE,
@@ -9,7 +15,6 @@ typedef enum signal_action {
NETDATA_SIGNAL_REOPEN_LOGS,
NETDATA_SIGNAL_RELOAD_HEALTH,
NETDATA_SIGNAL_FATAL,
- NETDATA_SIGNAL_CHILD,
} SIGNAL_ACTION;
static struct {
@@ -25,7 +30,6 @@ static struct {
{ SIGHUP, "SIGHUP", 0, NETDATA_SIGNAL_REOPEN_LOGS },
{ SIGUSR2, "SIGUSR2", 0, NETDATA_SIGNAL_RELOAD_HEALTH },
{ SIGBUS, "SIGBUS", 0, NETDATA_SIGNAL_FATAL },
- { SIGCHLD, "SIGCHLD", 0, NETDATA_SIGNAL_CHILD },
// terminator
{ 0, "NONE", 0, NETDATA_SIGNAL_END_OF_LIST }
@@ -93,18 +97,6 @@ void signals_init(void) {
}
}
-void signals_restore_SIGCHLD(void)
-{
- struct sigaction sa;
-
- sa.sa_flags = 0;
- sigfillset(&sa.sa_mask);
- sa.sa_handler = signal_handler;
-
- if(sigaction(SIGCHLD, &sa, NULL) == -1)
- netdata_log_error("SIGNAL: Failed to change signal handler for: SIGCHLD");
-}
-
void signals_reset(void) {
struct sigaction sa;
sigemptyset(&sa.sa_mask);
@@ -118,64 +110,6 @@ void signals_reset(void) {
}
}
-// reap_child reaps the child identified by pid.
-static void reap_child(pid_t pid) {
- siginfo_t i;
-
- errno = 0;
- netdata_log_debug(D_CHILDS, "SIGNAL: reap_child(%d)...", pid);
- if (netdata_waitid(P_PID, (id_t)pid, &i, WEXITED|WNOHANG) == -1) {
- if (errno != ECHILD)
- netdata_log_error("SIGNAL: waitid(%d): failed to wait for child", pid);
- else
- netdata_log_info("SIGNAL: waitid(%d): failed - it seems the child is already reaped", pid);
- return;
- }
- else if (i.si_pid == 0) {
- // Process didn't exit, this shouldn't happen.
- netdata_log_error("SIGNAL: waitid(%d): reports pid 0 - child has not exited", pid);
- return;
- }
-
- switch (i.si_code) {
- case CLD_EXITED:
- netdata_log_info("SIGNAL: reap_child(%d) exited with code: %d", pid, i.si_status);
- break;
- case CLD_KILLED:
- netdata_log_info("SIGNAL: reap_child(%d) killed by signal: %d", pid, i.si_status);
- break;
- case CLD_DUMPED:
- netdata_log_info("SIGNAL: reap_child(%d) dumped core by signal: %d", pid, i.si_status);
- break;
- case CLD_STOPPED:
- netdata_log_info("SIGNAL: reap_child(%d) stopped by signal: %d", pid, i.si_status);
- break;
- case CLD_TRAPPED:
- netdata_log_info("SIGNAL: reap_child(%d) trapped by signal: %d", pid, i.si_status);
- break;
- case CLD_CONTINUED:
- netdata_log_info("SIGNAL: reap_child(%d) continued by signal: %d", pid, i.si_status);
- break;
- default:
- netdata_log_info("SIGNAL: reap_child(%d) gave us a SIGCHLD with code %d and status %d.", pid, i.si_code, i.si_status);
- break;
- }
-}
-
-// reap_children reaps all pending children which are not managed by myp.
-static void reap_children() {
- siginfo_t i;
-
- while(1) {
- i.si_pid = 0;
- if (netdata_waitid(P_ALL, (id_t)0, &i, WEXITED|WNOHANG|WNOWAIT) == -1 || i.si_pid == 0)
- // nothing to do
- return;
-
- reap_child(i.si_pid);
- }
-}
-
void signals_handle(void) {
while(1) {
@@ -183,6 +117,7 @@ void signals_handle(void) {
// is delivered that either terminates the process or causes the invocation
// of a signal-catching function.
if(pause() == -1 && errno == EINTR) {
+ errno_clear();
// loop once, but keep looping while signals are coming in
// this is needed because a few operations may take some time
@@ -226,10 +161,6 @@ void signals_handle(void) {
fatal("SIGNAL: Received %s. netdata now exits.", name);
break;
- case NETDATA_SIGNAL_CHILD:
- reap_children();
- break;
-
default:
netdata_log_info("SIGNAL: Received %s. No signal handler configured. Ignoring it.", name);
break;