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:
committed by
GitHub
parent
feba2d1c80
commit
ae0d6007f1
@@ -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.
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user