- wxEndProcessData *proc_data = (wxEndProcessData *)data;
-
- // 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);
-
- if ( rc == 0 )
- {
- // This can only happen if the child application closes our dummy
- // pipe that is used to monitor its lifetime; in that case, our
- // best bet is to pretend the process did terminate, because
- // otherwise wxExecute() would hang indefinitely
- // (OnExceptionWaiting() won't be called again, the descriptor
- // is closed now).
- wxLogDebug("Child process (PID %i) still alive, even though notification was received that it terminated.", pid);
- }
- else if ( rc == -1 )
- {
- // As above, if waitpid() fails, the best we can do is to log the
- // error and pretend the child terminated:
- wxLogSysError(_("Failed to check child process' status"));
- }
-
- // set exit code to -1 if something bad happened
- proc_data->exitcode = (rc > 0 && WIFEXITED(status))
- ? WEXITSTATUS(status)
- : -1;