From 31f440e68b1a087093f1c34be1ad3444f911d7d9 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Wed, 1 Jul 1998 05:10:42 +0000 Subject: [PATCH] I've had reports of rsyncd leaving zombies under digital unix. This patch tries to address the problem in two ways: 1) reinstall the SIGCHLD handler before each fork 2) reap any children not caught by the handler using waitpid with WNOHANG. I expect this will fix the problem. --- socket.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/socket.c b/socket.c index 790a86d9..98093fcf 100644 --- a/socket.c +++ b/socket.c @@ -120,8 +120,6 @@ void start_accept_loop(int port, int (*fn)(int )) { int s; - signal(SIGCHLD, SIG_IGN); - /* open an incoming socket */ s = open_socket_in(SOCK_STREAM, port); if (s == -1) @@ -155,6 +153,15 @@ void start_accept_loop(int port, int (*fn)(int )) if (fd == -1) continue; + signal(SIGCHLD, SIG_IGN); + + /* we shouldn't have any children left hanging around + but I have had reports that on Digital Unix zombies + are produced, so this ensures that they are reaped */ +#ifdef WNOHANG + waitpid(-1, NULL, WNOHANG); +#endif + if (fork()==0) { close(s); -- 2.34.1