wait4() replaced by waitpid() which is POSIX
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1980 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -40,6 +40,7 @@
|
|||||||
#include <fcntl.h> // for O_WRONLY and friends
|
#include <fcntl.h> // for O_WRONLY and friends
|
||||||
#include <time.h> // nanosleep() and/or usleep()
|
#include <time.h> // nanosleep() and/or usleep()
|
||||||
#include <ctype.h> // isspace()
|
#include <ctype.h> // isspace()
|
||||||
|
|
||||||
#ifdef HAVE_UNAME
|
#ifdef HAVE_UNAME
|
||||||
#include <sys/utsname.h> // for uname()
|
#include <sys/utsname.h> // for uname()
|
||||||
#endif // HAVE_UNAME
|
#endif // HAVE_UNAME
|
||||||
@@ -65,25 +66,6 @@
|
|||||||
};
|
};
|
||||||
#endif // Unices without usleep()
|
#endif // Unices without usleep()
|
||||||
|
|
||||||
// many versions of Unices have this function, but it is not defined in system
|
|
||||||
// headers - please add your system here if it is the case for your OS.
|
|
||||||
// SunOS (and Solaris) and DG-UX are like this.
|
|
||||||
#ifdef HAVE_WAIT4
|
|
||||||
#if defined(__SOLARIS__) || defined(__osf__)
|
|
||||||
extern "C"
|
|
||||||
{
|
|
||||||
pid_t wait4(pid_t pid, int *statusp, int options,
|
|
||||||
struct rusage *rusage);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define wxWait4(pid, stat, flags, rusage) wait4(pid, stat, flags, rusage)
|
|
||||||
#else
|
|
||||||
// no wait4() at all on these systems
|
|
||||||
// TODO verify whether wait3() really works in this situation
|
|
||||||
#define wxWait4(pid, stat, flags, rusage) wait3(stat, flags, rusage)
|
|
||||||
#endif // HAVE_WAIT4
|
|
||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
// implementation
|
// implementation
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
@@ -143,47 +125,60 @@ long wxExecute( const wxString& command, bool sync, wxProcess *process )
|
|||||||
char quotechar = '\0'; // is arg quoted?
|
char quotechar = '\0'; // is arg quoted?
|
||||||
bool escaped = FALSE;
|
bool escaped = FALSE;
|
||||||
|
|
||||||
|
// split the command line in arguments
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
argument="";
|
argument="";
|
||||||
quotechar = '\0';
|
quotechar = '\0';
|
||||||
|
|
||||||
// eat leading whitespace:
|
// eat leading whitespace:
|
||||||
while(*cptr && isspace(*cptr))
|
while ( isspace(*cptr) )
|
||||||
cptr++;
|
cptr++;
|
||||||
if(*cptr == '\'' || *cptr == '"')
|
|
||||||
|
if ( *cptr == '\'' || *cptr == '"' )
|
||||||
quotechar = *cptr++;
|
quotechar = *cptr++;
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
if(*cptr == '\\' && ! escaped)
|
if ( *cptr == '\\' && ! escaped )
|
||||||
{
|
{
|
||||||
escaped = TRUE;
|
escaped = TRUE;
|
||||||
cptr++;
|
cptr++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// all other characters:
|
// all other characters:
|
||||||
argument += *cptr ++;
|
argument += *cptr++;
|
||||||
escaped = FALSE;
|
escaped = FALSE;
|
||||||
// Have we reached the end of the argument?
|
|
||||||
if((*cptr == quotechar && ! escaped)
|
// have we reached the end of the argument?
|
||||||
|| (quotechar == '\0' && isspace(*cptr))
|
if ( (*cptr == quotechar && ! escaped)
|
||||||
|| *cptr == '\0')
|
|| (quotechar == '\0' && isspace(*cptr))
|
||||||
|
|| *cptr == '\0' )
|
||||||
{
|
{
|
||||||
wxASSERT(argc < WXEXECUTE_NARGS);
|
wxASSERT_MSG( argc < WXEXECUTE_NARGS,
|
||||||
argv[argc] = new char[argument.Len()+1];
|
"too many arguments in wxExecute" );
|
||||||
|
|
||||||
|
argv[argc] = new char[argument.length() + 1];
|
||||||
strcpy(argv[argc], argument.c_str());
|
strcpy(argv[argc], argument.c_str());
|
||||||
argc++;
|
argc++;
|
||||||
|
|
||||||
// if not at end of buffer, swallow last character:
|
// if not at end of buffer, swallow last character:
|
||||||
if(*cptr) cptr++;
|
if(*cptr)
|
||||||
|
cptr++;
|
||||||
|
|
||||||
break; // done with this one, start over
|
break; // done with this one, start over
|
||||||
}
|
}
|
||||||
}while(*cptr);
|
} while(*cptr);
|
||||||
}while(*cptr);
|
} while(*cptr);
|
||||||
argv[argc] = NULL;
|
argv[argc] = NULL;
|
||||||
|
|
||||||
|
// do execute the command
|
||||||
long lRc = wxExecute(argv, sync, process);
|
long lRc = wxExecute(argv, sync, process);
|
||||||
|
|
||||||
|
// clean up
|
||||||
argc = 0;
|
argc = 0;
|
||||||
while(argv[argc])
|
while( argv[argc] )
|
||||||
delete [] argv[argc++];
|
delete [] argv[argc++];
|
||||||
|
|
||||||
return lRc;
|
return lRc;
|
||||||
@@ -204,13 +199,26 @@ void wxHandleProcessTermination(wxEndProcessData *proc_data)
|
|||||||
{
|
{
|
||||||
int pid = (proc_data->pid > 0) ? proc_data->pid : -(proc_data->pid);
|
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 status = 0;
|
||||||
wxWait4(pid, &status, 0, (rusage *) NULL);
|
if ( waitpid(pid, &status, 0) == -1 || !WIFEXITED(status) )
|
||||||
|
{
|
||||||
|
wxLogSysError(_("Waiting for subprocess termination failed"));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// notify user about termination if required
|
||||||
|
if (proc_data->process)
|
||||||
|
{
|
||||||
|
proc_data->process->OnTerminate(proc_data->pid,
|
||||||
|
WEXITSTATUS(status));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (proc_data->process)
|
// clean up
|
||||||
proc_data->process->OnTerminate(proc_data->pid, status);
|
if ( proc_data->pid > 0 )
|
||||||
|
|
||||||
if (proc_data->pid > 0)
|
|
||||||
{
|
{
|
||||||
delete proc_data;
|
delete proc_data;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user