diff --git a/FileUtils.cpp b/FileUtils.cpp index c436b81a..d9150223 100644 --- a/FileUtils.cpp +++ b/FileUtils.cpp @@ -556,11 +556,6 @@ int CExecSock::popen2(int & iReadFD, int & iWriteFD, const CString & sCommand) { void CExecSock::close2(int iPid, int iReadFD, int iWriteFD) { close(iReadFD); close(iWriteFD); - u_int iNow = time(NULL); - while (waitpid(iPid, NULL, WNOHANG) == 0) { - if ((time(NULL) - iNow) > 5) - break; // giveup - usleep(100); - } + // If a zombie is left behind, SIGCHLD will handle it return; } diff --git a/main.cpp b/main.cpp index a77cd2f7..7ff172f9 100644 --- a/main.cpp +++ b/main.cpp @@ -8,6 +8,7 @@ #include "znc.h" #include +#include static const struct option g_LongOpts[] = { { "help", no_argument, 0, 'h' }, @@ -61,6 +62,11 @@ static void rehash(int sig) { CZNC::Get().SetNeedRehash(true); } +static void reapChilds(int sig) { + while (waitpid(-1, NULL, WNOHANG) > 0) { + } +} + static bool isRoot() { // User root? If one of these were root, we could switch the others to root, too if (geteuid() == 0 || getuid() == 0) @@ -242,6 +248,9 @@ int main(int argc, char** argv) { sa.sa_handler = rehash; sigaction(SIGHUP, &sa, (struct sigaction*) NULL); + sa.sa_handler = reapChilds; + sigaction(SIGCHLD, &sa, (struct sigaction*) NULL); + // Once this signal is caught, the signal handler is reset // to SIG_DFL. This avoids endless loop with signals. sa.sa_flags = SA_RESETHAND;