-static void GTK_EndProcessDetector(gpointer data, gint source,
- GdkInputCondition WXUNUSED(condition) )
-{
- wxEndProcessData *proc_data = (wxEndProcessData *)data;
- int pid;
-
- pid = (proc_data->pid > 0) ? proc_data->pid : -(proc_data->pid);
-
- /* wait4 is not part of any standard, use at own risk
- * not sure what wait4 does, but wait3 seems to be closest, whats a digit ;-)
- * --- offer@sgi.com */
- // VZ: wait4() will be woken up by a signal, not wait3 - so it's quite
- // different (also, wait3() waits for any child, wait4() only for this
- // one)
- int status = -1;
-#if !defined(__sgi)
- wait4(pid, &status, 0, (rusage *) NULL);
-#else
- wait3(&status, 0, (rusage *) NULL);
-#endif
-
- close(source);
- gdk_input_remove(proc_data->tag);
-
- if (proc_data->process)
- proc_data->process->OnTerminate(proc_data->pid, status);
-
- if (proc_data->pid > 0)
- {
- delete proc_data;
- }
- else
- {
- // wxExecute() will know about it
- proc_data->exitcode = status;
-
- proc_data->pid = 0;
- }
-}
+ // has the process really terminated? unfortunately GDK (or GLib) seem to
+ // generate G_IO_HUP notification even when it simply tries to read from a
+ // closed fd and hasn't terminated at all
+ int pid = (proc_data->pid > 0) ? proc_data->pid : -(proc_data->pid);
+ int status = 0;
+ int rc = waitpid(pid, &status, WNOHANG);