// 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);
- if ( waitpid(pid, NULL, WNOHANG) == 0 )
+ int status = 0;
+ int rc = waitpid(pid, &status, WNOHANG);
+
+ if ( rc == 0 )
{
// no, it didn't exit yet, continue waiting
return;
}
+ // set exit code to -1 if something bad happened
+ proc_data->exitcode = rc != -1 && WIFEXITED(status) ? WEXITSTATUS(status)
+ : -1;
+
// child exited, end waiting
close(source);
// 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);
- if ( waitpid(pid, NULL, WNOHANG) == 0 )
+ int status = 0;
+ int rc = waitpid(pid, &status, WNOHANG);
+
+ if ( rc == 0 )
{
// no, it didn't exit yet, continue waiting
return;
}
+ // set exit code to -1 if something bad happened
+ proc_data->exitcode = rc != -1 && WIFEXITED(status) ? WEXITSTATUS(status)
+ : -1;
+
// child exited, end waiting
close(source);
void wxHandleProcessTermination(wxEndProcessData *proc_data)
{
- int pid = (proc_data->pid > 0) ? proc_data->pid : -(proc_data->pid);
-
- // waitpid is POSIX so should be available everywhere, however on older
- // systems wait() might be used instead in a loop (until the right pid
- // terminates)
- int status = 0;
- int rc;
-
- // wait for child termination and if waitpid() was interrupted, try again
- do
- {
- rc = waitpid(pid, &status, 0);
- }
- while ( rc == -1 && errno == EINTR );
-
// notify user about termination if required
if ( proc_data->process )
{
- proc_data->process->OnTerminate
- (
- proc_data->pid,
- (rc == 0) && WIFEXITED(status)
- ? WEXITSTATUS(status)
- : -1
- );
+ proc_data->process->OnTerminate(proc_data->pid, proc_data->exitcode);
}
+
// clean up
if ( proc_data->pid > 0 )
{
}
else
{
- // wxExecute() will know about it
- proc_data->exitcode = status;
-
+ // let wxExecute() know that the process has terminated
proc_data->pid = 0;
}
}