tReplaced dodgy single fork process spawning code with much nicer double fork, to avoid creating zombie processes. - vaccinewars - be a doctor and try to vaccinate the world
 (HTM) git clone git://src.adamsgaard.dk/vaccinewars
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 147442dcbe60931edd8763928f6913c2cca6310f
 (DIR) parent 064d97cc35949782635605a9d9caf3b648ed8f52
 (HTM) Author: Ben Webb <ben@salilab.org>
       Date:   Fri, 24 May 2002 11:18:59 +0000
       
       Replaced dodgy single fork process spawning code with much nicer double
       fork, to avoid creating zombie processes.
       
       
       Diffstat:
         M src/gtkport/gtkport.c               |      18 ++++++++++++++----
       
       1 file changed, 14 insertions(+), 4 deletions(-)
       ---
 (DIR) diff --git a/src/gtkport/gtkport.c b/src/gtkport/gtkport.c
       t@@ -26,6 +26,7 @@
        
        #ifndef CYGWIN
        #include <sys/types.h>          /* For pid_t (fork) */
       +#include <sys/wait.h>           /* For wait */
        #ifdef HAVE_UNISTD_H
        #include <unistd.h>             /* For fork and execv */
        #endif
       t@@ -5275,6 +5276,7 @@ static gboolean gtk_url_triggered(GtkWidget *widget, GdkEventButton *event,
        #ifdef HAVE_FORK
          gchar *bin, *target, *args[3];
          pid_t pid;
       +  int status;
        
          target = (gchar *)gtk_object_get_data(GTK_OBJECT(widget), "target");
          bin = (gchar *)gtk_object_get_data(GTK_OBJECT(widget), "bin");
       t@@ -5283,11 +5285,19 @@ static gboolean gtk_url_triggered(GtkWidget *widget, GdkEventButton *event,
            args[0] = bin;
            args[1] = target;
            args[2] = NULL;
       +    /* Fork twice so that the spawned process gets init as its parent */
            pid = fork();
       -    if (pid == 0) {
       -      execv(bin, args);
       -      g_print("dopewars: cannot execute %s\n", bin);
       -      _exit(1);
       +    if (pid > 0) {
       +      waitpid(-1, &status, WNOHANG);
       +    } else if (pid == 0) {
       +      pid = fork();
       +      if (pid == 0) {
       +        execv(bin, args);
       +        g_print("dopewars: cannot execute %s\n", bin);
       +        exit(1);
       +      } else {
       +        exit(0);
       +      }
            }
          }
        #endif