From 51b1f3a02116c9e2b6393aa127ec7ad3c3605ae0 Mon Sep 17 00:00:00 2001 From: valenok Date: Sun, 26 Sep 2010 22:20:20 +0100 Subject: [PATCH] Under Linux, reap CGI zombies reliably --- main.c | 13 +------------ mongoose.c | 5 ++++- 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/main.c b/main.c index 137ddc8d..c5012689 100644 --- a/main.c +++ b/main.c @@ -65,15 +65,7 @@ static struct mg_context *ctx; // Set by start_mongoose() #endif /* !CONFIG_FILE */ static void WINCDECL signal_handler(int sig_num) { -#if !defined(_WIN32) - if (sig_num == SIGCHLD) { - do { - } while (waitpid(-1, &sig_num, WNOHANG) > 0); - } else -#endif /* !_WIN32 */ - { - exit_flag = sig_num; - } + exit_flag = sig_num; } static void die(const char *fmt, ...) { @@ -260,9 +252,6 @@ static void start_mongoose(int argc, char *argv[]) { process_command_line_arguments(argv, options); /* Setup signal handler: quit on Ctrl-C */ -#ifndef _WIN32 - signal(SIGCHLD, signal_handler); -#endif /* _WIN32 */ signal(SIGTERM, signal_handler); signal(SIGINT, signal_handler); diff --git a/mongoose.c b/mongoose.c index 74557222..8b6fb64a 100644 --- a/mongoose.c +++ b/mongoose.c @@ -2832,7 +2832,7 @@ static void prepare_cgi_environment(struct mg_connection *conn, } static void handle_cgi_request(struct mg_connection *conn, const char *prog) { - int headers_len, data_len, i, fd_stdin[2], fd_stdout[2]; + int headers_len, data_len, i, exit_status, fd_stdin[2], fd_stdout[2]; const char *status; char buf[BUFSIZ], *pbuf, dir[PATH_MAX], *p; struct mg_request_info ri; @@ -2925,6 +2925,9 @@ static void handle_cgi_request(struct mg_connection *conn, const char *prog) { done: if (pid != (pid_t) -1) { kill(pid, SIGKILL); +#if !defined(_WIN32) + do {} while (waitpid(-1, &exit_status, WNOHANG) > 0); +#endif } if (fd_stdin[0] != -1) { (void) close(fd_stdin[0]);