Ver código fonte

Under Linux, reap CGI zombies reliably

valenok 14 anos atrás
pai
commit
51b1f3a021
2 arquivos alterados com 5 adições e 13 exclusões
  1. 1 12
      main.c
  2. 4 1
      mongoose.c

+ 1 - 12
main.c

@@ -65,15 +65,7 @@ static struct mg_context *ctx;      // Set by start_mongoose()
 #endif /* !CONFIG_FILE */
 #endif /* !CONFIG_FILE */
 
 
 static void WINCDECL signal_handler(int sig_num) {
 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, ...) {
 static void die(const char *fmt, ...) {
@@ -260,9 +252,6 @@ static void start_mongoose(int argc, char *argv[]) {
   process_command_line_arguments(argv, options);
   process_command_line_arguments(argv, options);
 
 
   /* Setup signal handler: quit on Ctrl-C */
   /* Setup signal handler: quit on Ctrl-C */
-#ifndef _WIN32
-  signal(SIGCHLD, signal_handler);
-#endif /* _WIN32 */
   signal(SIGTERM, signal_handler);
   signal(SIGTERM, signal_handler);
   signal(SIGINT, signal_handler);
   signal(SIGINT, signal_handler);
 
 

+ 4 - 1
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) {
 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;
   const char *status;
   char buf[BUFSIZ], *pbuf, dir[PATH_MAX], *p;
   char buf[BUFSIZ], *pbuf, dir[PATH_MAX], *p;
   struct mg_request_info ri;
   struct mg_request_info ri;
@@ -2925,6 +2925,9 @@ static void handle_cgi_request(struct mg_connection *conn, const char *prog) {
 done:
 done:
   if (pid != (pid_t) -1) {
   if (pid != (pid_t) -1) {
     kill(pid, SIGKILL);
     kill(pid, SIGKILL);
+#if !defined(_WIN32)
+    do {} while (waitpid(-1, &exit_status, WNOHANG) > 0);
+#endif
   }
   }
   if (fd_stdin[0] != -1) {
   if (fd_stdin[0] != -1) {
     (void) close(fd_stdin[0]);
     (void) close(fd_stdin[0]);