1
0
mirror of https://github.com/netdata/netdata.git synced 2021-06-06 23:03:21 +03:00

Restore SIGCHLD signal handler after being replaced by libuv (#9107)

This commit is contained in:
Markos Fountoulakis
2020-05-20 17:25:35 +03:00
committed by GitHub
parent feba2d1c80
commit ae0d6007f1
3 changed files with 24 additions and 0 deletions

View File

@@ -1384,6 +1384,14 @@ int main(int argc, char **argv) {
// fork the spawn server
spawn_init();
/*
* Libuv uv_spawn() uses SIGCHLD internally:
* https://github.com/libuv/libuv/blob/cc51217a317e96510fbb284721d5e6bc2af31e33/src/unix/process.c#L485
* and inadvertently replaces the netdata signal handler which was setup during initialization.
* Thusly, we must explicitly restore the signal handler for SIGCHLD.
* Warning: extreme care is needed when mixing and matching POSIX and libuv.
*/
signals_restore_SIGCHLD();
// ------------------------------------------------------------------------
// initialize rrd, registry, health, rrdpush, etc.

View File

@@ -111,6 +111,21 @@ void signals_init(void) {
}
}
void signals_restore_SIGCHLD(void)
{
struct sigaction sa;
if (reaper_enabled == 0)
return;
sa.sa_flags = 0;
sigfillset(&sa.sa_mask);
sa.sa_handler = signal_handler;
if(sigaction(SIGCHLD, &sa, NULL) == -1)
error("SIGNAL: Failed to change signal handler for: SIGCHLD");
}
void signals_reset(void) {
struct sigaction sa;
sigemptyset(&sa.sa_mask);

View File

@@ -6,6 +6,7 @@
extern void signals_init(void);
extern void signals_block(void);
extern void signals_unblock(void);
extern void signals_restore_SIGCHLD(void);
extern void signals_reset(void);
extern void signals_handle(void) NORETURN;