fix for running csh scripts using wxExecute()

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@11767 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 2001-10-01 12:32:07 +00:00
parent 9e4e191af3
commit dbd25330c5
2 changed files with 32 additions and 8 deletions

View File

@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// Name: utils.cpp // Name: src/gtk/utilsgtk.cpp
// Purpose: // Purpose:
// Author: Robert Roebling // Author: Robert Roebling
// Id: $Id$ // Id: $Id$
@ -21,6 +21,7 @@
#include <string.h> #include <string.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/wait.h> // for WNOHANG
#include <unistd.h> #include <unistd.h>
#include "glib.h" #include "glib.h"
@ -142,12 +143,23 @@ static void GTK_EndProcessDetector(gpointer data, gint source,
GdkInputCondition WXUNUSED(condition) ) GdkInputCondition WXUNUSED(condition) )
{ {
wxEndProcessData *proc_data = (wxEndProcessData *)data; 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);
if ( waitpid(pid, NULL, WNOHANG) == 0 )
{
// no, it didn't exit yet, continue waiting
return;
}
// child exited, end waiting
close(source); close(source);
// don't call us again!
gdk_input_remove(proc_data->tag); gdk_input_remove(proc_data->tag);
// This has to come after gdk_input_remove() or we will
// occasionally receive multiple callbacks with corrupt data
// pointers. (KB)
wxHandleProcessTermination(proc_data); wxHandleProcessTermination(proc_data);
} }

View File

@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// Name: utils.cpp // Name: src/gtk/utilsgtk.cpp
// Purpose: // Purpose:
// Author: Robert Roebling // Author: Robert Roebling
// Id: $Id$ // Id: $Id$
@ -21,6 +21,7 @@
#include <string.h> #include <string.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/wait.h> // for WNOHANG
#include <unistd.h> #include <unistd.h>
#include "glib.h" #include "glib.h"
@ -142,12 +143,23 @@ static void GTK_EndProcessDetector(gpointer data, gint source,
GdkInputCondition WXUNUSED(condition) ) GdkInputCondition WXUNUSED(condition) )
{ {
wxEndProcessData *proc_data = (wxEndProcessData *)data; 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);
if ( waitpid(pid, NULL, WNOHANG) == 0 )
{
// no, it didn't exit yet, continue waiting
return;
}
// child exited, end waiting
close(source); close(source);
// don't call us again!
gdk_input_remove(proc_data->tag); gdk_input_remove(proc_data->tag);
// This has to come after gdk_input_remove() or we will
// occasionally receive multiple callbacks with corrupt data
// pointers. (KB)
wxHandleProcessTermination(proc_data); wxHandleProcessTermination(proc_data);
} }