📄 subprocess.h
字号:
//####COPYRIGHTBEGIN####
//
// ----------------------------------------------------------------------------
// Copyright (C) 1998, 1999, 2000 Red Hat, Inc.
//
// This program is part of the eCos host tools.
//
// This program is free software; you can redistribute it and/or modify it
// under the terms of the GNU General Public License as published by the Free
// Software Foundation; either version 2 of the License, or (at your option)
// any later version.
//
// This program is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
// more details.
//
// You should have received a copy of the GNU General Public License along with
// this program; if not, write to the Free Software Foundation, Inc.,
// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
//
// ----------------------------------------------------------------------------
//
//####COPYRIGHTEND####
//===========================================================================
//#####DESCRIPTIONBEGIN####
//
// Author(s): sdf
// Contact(s): sdf
// Date: 1998/08/11
// Version: 0.01
// Purpose:
// Description: Interface of the subprocess clas
// Requires:
// Provides:
// See also:
// Known bugs:
// Usage:
//
//####DESCRIPTIONEND####
//
//===========================================================================
#ifndef _SUBPROCESS_H
#define _SUBPROCESS_H
//===========================================================================
// This class spawns subprocesses in a host-independent manner [almost]
//===========================================================================
#include "eCosStd.h"
#include "eCosThreadUtils.h"
#include "Collections.h"
class CSubprocess {
public:
void SetPath (LPCTSTR pszPath) { m_strPath=pszPath; }
const String ErrorString() const;
// If bAutodelete is set, the class object will delete itself when the process is finished.
// This must only be used if the class object is allocated on the heap.
CSubprocess(bool bAutodelete=false);
virtual ~CSubprocess();
void SetVerbose (bool b) { m_bVerbose=b; }
void SetDirectory (LPCTSTR pszDir) { m_strDir=pszDir; }
// Various forms of the Run function. In each case under UNIX the Run results will always return true
// (because we can't determine the result of the exec after fork). Under NT the result correctly represents
// whether the process creation was successful
// Run (blocking) sending the output to strOutput.
bool Run(String &strOutput,LPCTSTR pszCmd) { return Run(AppendFunc,&strOutput,pszCmd,true); }
// Run sending output to callback
bool Run(LogFunc *pfnLog,void * pLogparam,LPCTSTR pszCmd,bool bBlock=true);
int Pid() const { return m_idProcess; } // returns process id (even when process is terminated)
// Get the CPU time of the process (and, optionally, its children)
// Note that under UNIX this involves running ps and so may not be that cheap.
Time CpuTime(bool bRecurse=true) const;
// Get the process exit code. This can be:
// exit code of process (if terminated)
// 0xffffffff (if process not yet run)
// GetLastError result (if process could not be run)
int GetExitCode() { return m_nExitCode; }
// Kill the process:
bool Kill(bool bRecurse=true);
// Send some input to the process:
void Send (LPCTSTR psz);
// Close it (cause EOF to be read)
void CloseInput();
// Is the process running?
bool ProcessAlive();
// Appendfunc can be used to achieve a non-blocking addition to some string
static void CALLBACK AppendFunc(void *pParam,LPCTSTR psz) {
ENTERCRITICAL;
*((String *)pParam)+=psz;
LEAVECRITICAL;
}
// This function may be used to stop a process given some condition evaluated externally,
// As long as the function returns true the process will be allowed to continue
typedef bool (CALLBACK ContinuationFunc)(void *);
void SetContinuationFunc(ContinuationFunc *pfnContinue,void *pParam){m_pfnContinue=pfnContinue;m_pContinuationFuncParam=pParam;}
// Wait for completion of the process, with optional timeout. If the timeout occurs without the process
// having terminated, the result will be false.
bool Wait(Duration dTimeout=0x7fffffff);
protected:
String m_strPath;
static const String Name (int pid); // for debugging - only works under NT
ContinuationFunc *m_pfnContinue;
void *m_pContinuationFuncParam;
static bool CALLBACK DefaultContinuationFunc(void *) { return true; }
static void CALLBACK NullLogFunc(void *,LPCTSTR) {}
struct PInfo;
struct PInfo {
PInfo *pParent;
#ifdef _WIN32
__int64 tCreation;
#endif
Time tCpu;
int PID;
int PPID;
bool IsChildOf(int pid) const;
};
typedef std::vector<PInfo> PInfoArray;
static bool PSExtract(PInfoArray &arPinfo);
static void SetParents(PInfoArray &arPinfo);
#ifdef _WIN32
static DWORD GetPlatform();
HANDLE m_hrPipe;
HANDLE m_hwPipe;
HANDLE m_hProcess; // This handle is "owned" by the ThreadFunc
static HINSTANCE hInstLib1, hInstLib2;
int m_nErr;
#else
int m_tty;
String m_strCmd;
#endif
static void CALLBACK SThreadFunc(void *pParam) { ((CSubprocess *)pParam)->ThreadFunc(); }
void ThreadFunc();
bool m_bAutoDelete;
bool m_bThreadTerminated;
bool m_bVerbose;
int m_nExitCode;
int m_idProcess;
void *m_pLogparam;
LogFunc *m_pfnLogfunc;
bool m_bKillThread;
static const unsigned int PROCESS_KILL_EXIT_CODE;
bool CreateProcess(LPCTSTR pszCmdline);
struct CygProcessInfo {
int nPid;
int nPpid;
int nPgid;
int nWinpid;
};
void Output(LPCTSTR psz);
String m_strDir;
};
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -