uloop: make SIGCHLD signal handling optional
authorPetar Paradzik <petar.paradzik@sartura.hr>
Mon, 3 Jul 2017 11:37:56 +0000 (13:37 +0200)
committerFelix Fietkau <nbd@nbd.name>
Fri, 29 Sep 2017 11:37:17 +0000 (13:37 +0200)
Some programs want to manage their own child life cycle without using
SIGCHLD signal handler. In these cases, uloop is reaping children for
them because they don't have SIGCHLD handler set. This patch makes it
possible to disable reaping children through 'uloop_handle_sigchld'
variable.

Signed-off-by: Petar Paradzik <petar.paradzik@sartura.hr>
uloop.c

diff --git a/uloop.c b/uloop.c
index 3813e188522d87c03877072ea820a48f5526eafe..8517366a55f19154b25a67dd21ce1e08f09e1589 100644 (file)
--- a/uloop.c
+++ b/uloop.c
@@ -58,6 +58,7 @@ static struct list_head processes = LIST_HEAD_INIT(processes);
 
 static int poll_fd = -1;
 bool uloop_cancelled = false;
+bool uloop_handle_sigchld = true;
 static int uloop_status = 0;
 static bool do_sigchld = false;
 
@@ -466,7 +467,9 @@ static void uloop_setup_signals(bool add)
 
        uloop_install_handler(SIGINT, uloop_handle_sigint, &old_sigint, add);
        uloop_install_handler(SIGTERM, uloop_handle_sigint, &old_sigterm, add);
-       uloop_install_handler(SIGCHLD, uloop_sigchld, &old_sigchld, add);
+
+       if (uloop_handle_sigchld)
+               uloop_install_handler(SIGCHLD, uloop_sigchld, &old_sigchld, add);
 
        uloop_ignore_signal(SIGPIPE, add);
 }