103 lines
2.9 KiB
C
103 lines
2.9 KiB
C
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// Name: wx/unix/execute.h
|
||
|
// Purpose: private details of wxExecute() implementation
|
||
|
// Author: Vadim Zeitlin
|
||
|
// Copyright: (c) 1998 Robert Roebling, Julian Smart, Vadim Zeitlin
|
||
|
// (c) 2013 Vadim Zeitlin
|
||
|
// Licence: wxWindows licence
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
#ifndef _WX_UNIX_EXECUTE_H
|
||
|
#define _WX_UNIX_EXECUTE_H
|
||
|
|
||
|
#include "wx/app.h"
|
||
|
#include "wx/hashmap.h"
|
||
|
#include "wx/process.h"
|
||
|
|
||
|
#if wxUSE_STREAMS
|
||
|
#include "wx/unix/pipe.h"
|
||
|
#include "wx/private/streamtempinput.h"
|
||
|
#endif
|
||
|
|
||
|
class wxEventLoopBase;
|
||
|
|
||
|
// Information associated with a running child process.
|
||
|
class wxExecuteData
|
||
|
{
|
||
|
public:
|
||
|
wxExecuteData()
|
||
|
{
|
||
|
flags =
|
||
|
pid = 0;
|
||
|
exitcode = -1;
|
||
|
|
||
|
process = NULL;
|
||
|
|
||
|
syncEventLoop = NULL;
|
||
|
|
||
|
#if wxUSE_STREAMS
|
||
|
fdOut =
|
||
|
fdErr = wxPipe::INVALID_FD;
|
||
|
#endif // wxUSE_STREAMS
|
||
|
}
|
||
|
|
||
|
// This must be called in the parent process as soon as fork() returns to
|
||
|
// update us with the effective child PID. It also ensures that we handle
|
||
|
// SIGCHLD to be able to detect when this PID exits, so wxTheApp must be
|
||
|
// available.
|
||
|
void OnStart(int pid);
|
||
|
|
||
|
// Called when the child process exits.
|
||
|
void OnExit(int exitcode);
|
||
|
|
||
|
// Return true if we should (or already did) redirect the child IO.
|
||
|
bool IsRedirected() const { return process && process->IsRedirected(); }
|
||
|
|
||
|
|
||
|
// wxExecute() flags
|
||
|
int flags;
|
||
|
|
||
|
// the pid of the child process
|
||
|
int pid;
|
||
|
|
||
|
// The exit code of the process, set once the child terminates.
|
||
|
int exitcode;
|
||
|
|
||
|
// the associated process object or NULL
|
||
|
wxProcess *process;
|
||
|
|
||
|
// Local event loop used to wait for the child process termination in
|
||
|
// synchronous execution case. We can't create it ourselves as its exact
|
||
|
// type depends on the application kind (console/GUI), so we rely on
|
||
|
// wxAppTraits setting up this pointer to point to the appropriate object.
|
||
|
wxEventLoopBase *syncEventLoop;
|
||
|
|
||
|
#if wxUSE_STREAMS
|
||
|
// the input buffer bufOut is connected to stdout, this is why it is
|
||
|
// called bufOut and not bufIn
|
||
|
wxStreamTempInputBuffer bufOut,
|
||
|
bufErr;
|
||
|
|
||
|
// the corresponding FDs, -1 if not redirected
|
||
|
int fdOut,
|
||
|
fdErr;
|
||
|
#endif // wxUSE_STREAMS
|
||
|
|
||
|
|
||
|
private:
|
||
|
// SIGCHLD signal handler that checks whether any of the currently running
|
||
|
// children have exited.
|
||
|
static void OnSomeChildExited(int sig);
|
||
|
|
||
|
// All currently running child processes indexed by their PID.
|
||
|
//
|
||
|
// Notice that the container doesn't own its elements.
|
||
|
WX_DECLARE_HASH_MAP(int, wxExecuteData*, wxIntegerHash, wxIntegerEqual,
|
||
|
ChildProcessesData);
|
||
|
static ChildProcessesData ms_childProcesses;
|
||
|
|
||
|
wxDECLARE_NO_COPY_CLASS(wxExecuteData);
|
||
|
};
|
||
|
|
||
|
#endif // _WX_UNIX_EXECUTE_H
|