diff --git a/FileUtils.cpp b/FileUtils.cpp index d9150223..ebfe18d3 100644 --- a/FileUtils.cpp +++ b/FileUtils.cpp @@ -556,6 +556,11 @@ int CExecSock::popen2(int & iReadFD, int & iWriteFD, const CString & sCommand) { void CExecSock::close2(int iPid, int iReadFD, int iWriteFD) { close(iReadFD); close(iWriteFD); - // If a zombie is left behind, SIGCHLD will handle it + u_int iNow = time(NULL); + while (waitpid(iPid, NULL, WNOHANG) == 0) { + if ((time(NULL) - iNow) > 5) + break; // giveup + usleep(100); + } return; } diff --git a/main.cpp b/main.cpp index 7ff172f9..e389a5b2 100644 --- a/main.cpp +++ b/main.cpp @@ -62,11 +62,6 @@ 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) @@ -248,9 +243,6 @@ 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;