From 41a14391a2906985de340d47823bd3e1f0c3afeb Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Wed, 2 Jun 2021 16:18:03 +0200 Subject: [PATCH] Refactor sigchld_cb(), handle EINTR properly, restart waitpid() The waitpid() function can return -1 due to EINTR (signal), so we should restart it to make sure we collect all zombies. Signed-off-by: Joachim Wiberg --- src/sig.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/sig.c b/src/sig.c index d25cfe6a..0d002464 100644 --- a/src/sig.c +++ b/src/sig.c @@ -403,13 +403,17 @@ static void sigchld_cb(uev_t *w, void *arg, int events) } /* Reap all the children! */ - do { + while (1) { pid = waitpid(-1, &status, WNOHANG); - if (pid > 0) { - _d("Collected child %d", pid); - service_monitor(pid, status); + if (pid <= 0) { + if (pid == -1 && errno == EINTR) + continue; + break; } - } while (pid > 0); + + _d("Collected child %d", pid); + service_monitor(pid, status); + } } /*