wxExecute() fixes and doc updates: the return value for sync exec case is now

the exit code of the process and not its pid. Warning: MSW code is untested.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1712 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
1999-02-17 21:04:47 +00:00
parent 220a0f42d4
commit e6045e08ed
4 changed files with 102 additions and 44 deletions

View File

@@ -946,9 +946,13 @@ arguments, terminated by NULL.
If {\it sync} is FALSE (the default), flow of control immediately returns.
If TRUE, the current application waits until the other program has terminated.
The return value is the process id, not the exit code of invoked program (for
this you should use wxProcess). A zero value indicates that the command could
not be executed.
In the case of synchronous execution, the return value is trhe exit code of
the process (which terminates by the moment the function returns) and will be
$-1$ if the process couldn't be started and typically 0 if the process
terminated successfully.
For asynchronous execution, however, the return value is the process id and
zero value indicates that the command could not be executed.
If callback isn't NULL and if execution is asynchronous (note that callback
parameter can not be non NULL for synchronous execution),

View File

@@ -252,10 +252,14 @@ bool wxDirExists( const wxString& dir )
// subprocess routines
//------------------------------------------------------------------------
// if pid > 0, the execution is async and the data is freed in
// GTK_EndProcessDetector, if pid < 0, the execution is synchronous and the
// caller (wxExecute) frees the data
struct wxEndProcessData
{
gint pid, tag;
wxProcess *process;
int exitcode;
};
static void GTK_EndProcessDetector(gpointer data, gint source,
@@ -274,7 +278,7 @@ static void GTK_EndProcessDetector(gpointer data, gint source,
// one)
int status = -1;
#if !defined(__sgi)
wait4(proc_data->pid, &status, 0, (rusage *) NULL);
wait4(pid, &status, 0, (rusage *) NULL);
#else
wait3(&status, 0, (rusage *) NULL);
#endif
@@ -286,9 +290,16 @@ static void GTK_EndProcessDetector(gpointer data, gint source,
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;
}
}
long wxExecute( char **argv, bool sync, wxProcess *process )
@@ -356,26 +367,35 @@ long wxExecute( char **argv, bool sync, wxProcess *process )
close(end_proc_detect[1]); // close writing side
data->tag = gdk_input_add(end_proc_detect[0], GDK_INPUT_READ,
GTK_EndProcessDetector, (gpointer)data);
data->pid = pid;
if (!sync)
if ( sync )
{
data->process = process;
}
else
{
data->process = process;
data->pid = -(data->pid);
wxASSERT_MSG( !process, "wxProcess param ignored for sync exec" );
data->process = NULL;
// sync execution: indicate it by negating the pid
data->pid = -pid;
// it will be set to 0 from GTK_EndProcessDetector
while (data->pid != 0)
wxYield();
delete data;
}
int exitcode = data->exitcode;
delete data;
return exitcode;
}
else
{
// async execution, nothing special to do - caller will be
// notified about the process terminationif process != NULL, data
// will be deleted in GTK_EndProcessDetector
data->process = process;
data->pid = pid;
// @@@ our return value indicates success even if execvp() in the child
// failed!
return pid;
}
}
}
long wxExecute( const wxString& command, bool sync, wxProcess *process )

View File

@@ -252,10 +252,14 @@ bool wxDirExists( const wxString& dir )
// subprocess routines
//------------------------------------------------------------------------
// if pid > 0, the execution is async and the data is freed in
// GTK_EndProcessDetector, if pid < 0, the execution is synchronous and the
// caller (wxExecute) frees the data
struct wxEndProcessData
{
gint pid, tag;
wxProcess *process;
int exitcode;
};
static void GTK_EndProcessDetector(gpointer data, gint source,
@@ -274,7 +278,7 @@ static void GTK_EndProcessDetector(gpointer data, gint source,
// one)
int status = -1;
#if !defined(__sgi)
wait4(proc_data->pid, &status, 0, (rusage *) NULL);
wait4(pid, &status, 0, (rusage *) NULL);
#else
wait3(&status, 0, (rusage *) NULL);
#endif
@@ -286,9 +290,16 @@ static void GTK_EndProcessDetector(gpointer data, gint source,
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;
}
}
long wxExecute( char **argv, bool sync, wxProcess *process )
@@ -356,26 +367,35 @@ long wxExecute( char **argv, bool sync, wxProcess *process )
close(end_proc_detect[1]); // close writing side
data->tag = gdk_input_add(end_proc_detect[0], GDK_INPUT_READ,
GTK_EndProcessDetector, (gpointer)data);
data->pid = pid;
if (!sync)
if ( sync )
{
data->process = process;
}
else
{
data->process = process;
data->pid = -(data->pid);
wxASSERT_MSG( !process, "wxProcess param ignored for sync exec" );
data->process = NULL;
// sync execution: indicate it by negating the pid
data->pid = -pid;
// it will be set to 0 from GTK_EndProcessDetector
while (data->pid != 0)
wxYield();
delete data;
}
int exitcode = data->exitcode;
delete data;
return exitcode;
}
else
{
// async execution, nothing special to do - caller will be
// notified about the process terminationif process != NULL, data
// will be deleted in GTK_EndProcessDetector
data->process = process;
data->pid = pid;
// @@@ our return value indicates success even if execvp() in the child
// failed!
return pid;
}
}
}
long wxExecute( const wxString& command, bool sync, wxProcess *process )

View File

@@ -260,7 +260,17 @@ long wxExecute(const wxString& command, bool sync, wxProcess *handler)
data->dwProcessId = pi.dwProcessId;
data->hWnd = hwnd;
data->state = sync;
if ( sync )
{
wxASSERT_MSG( !handler, "wxProcess param ignored for sync execution" );
data->handler = NULL;
}
else
{
// may be NULL or not
data->handler = handler;
}
DWORD tid;
HANDLE hThread = ::CreateThread(NULL,
@@ -284,6 +294,8 @@ long wxExecute(const wxString& command, bool sync, wxProcess *handler)
if ( !sync )
{
// clean up will be done when the process terminates
// return the pid
return pi.dwProcessId;
}
@@ -291,9 +303,11 @@ long wxExecute(const wxString& command, bool sync, wxProcess *handler)
while ( data->state )
wxYield();
DWORD dwExitCode = data->dwExitCode;
delete data;
return pi.dwProcessId;
// return the exit code
return dwExitCode;
#endif // 0/1
#else // Win16
long instanceID = WinExec((LPCSTR) WXSTRINGCAST command, SW_SHOW);