📄 process.cpp
字号:
#include <osdef.h>
#include <System.h>
#include <Api.h> //Sgos api
namespace System{
int Process::CreateProcess( string fileName ){
//创建进程
int pid, i;
string procName;
ProcessCreateInfo info;
File file;
file.Open( fileName, FileMode::Read );
if( file.Status()==FileStatus::Open ){
procName = file.GetFileName( FileName::NameOnly );
file.Close();
}else{
return -1;
}
String::Copy( info.processName, procName.GetData(), PROCESSNAME_LEN );
info.currentDir = (char*)0; //use current
info.rootDir = (char*)0; //use current
info.standardInput = (char*)0; //no
info.standardOutput = (char*)0; //no
info.standardError = (char*)0; //no
info.stackSize = 0; //use system value
i = KCreateProcess(fileName,
&info,
NULL,
NULL,
&pid );
//父进程
return pid;
}
int Process::CreatePipeProcess( string fileName, string input, string output, string err ){
//创建进程
int pid, i;
string procName;
char pipeStdoutName[256];
ProcessCreateInfo info;
File file;
file.Open( fileName, FileMode::Read );
if( file.Status()==FileStatus::Open ){
procName = file.GetFileName( FileName::NameOnly );
file.Close();
}else{
return -1;
}
String::Copy( info.processName, procName.GetData(), PROCESSNAME_LEN );
info.currentDir = (char*)0; //use current
info.rootDir = (char*)0; //use current
//设置标准输入输出
info.standardInput = input; //
info.standardOutput = output; //
info.standardError = err; //
info.stackSize = 0; //use system value
i = KCreateProcess(fileName,
&info,
NULL,
NULL,
&pid );
//父进程
return pid;
}
int Process::GetProcessList( ArrayInteger& list )
{
int maxNum = 128, fno; //最多读取进程数目
fno = KOpenFile("/iProcess/?", FILE_READ, 0);
if( fno<0 ) return false;
tagControlBuffer cb;
cb.outBufferLength = maxNum * sizeof(int);
cb.outBuffer = (void*) new int[maxNum];
if( KControlFile( fno, IPROC_GET_PROCESSES, (int)&cb ) < 0)
{
KCloseFile( fno );
return false;
}
KCloseFile(fno);
int *pid = (int*)cb.outBuffer;
for(; int(pid)-int(cb.outBuffer)<cb.info; pid ++ ){
list.Add( *pid );
}
return true;
}
int Process::GetProcessId( string strProcessName )
{
string path = string("/iProcess/") + strProcessName;
int fno = KOpenFile( path, FILE_READ, 0);
if( fno<0 ) return false;
tagControlBuffer cb;
if( KControlFile( fno, IPROC_GET_PID, (int)&cb ) < 0)
{
KCloseFile( fno );
return false;
}
KCloseFile(fno);
return cb.info;
}
int Process::KillProcess( int pid, int code )
{
KTerminateProcess( pid, code );
return 0;
}
bool Process::SetCurrentDir( string fileName )
{
int ret;
ret = KSetCurrentDir( fileName );
if( ret<0 )
return false;
else
return true;
}
bool Process::SetRootDir( string fileName )
{
int ret;
ret = KSetRootDir( fileName );
if( ret<0 )
return false;
else
return true;
}
string Process::GetCurrentDir()
{
char buf[MAX_PATHLEN];
KGetCurrentDir( buf, MAX_PATHLEN );
return string(buf);
}
string Process::GetRootDir()
{
char buf[MAX_PATHLEN];
KGetRootDir( buf, MAX_PATHLEN );
return string(buf);
}
bool Process::SetStandardInput( string fileName )
{
int ret;
ret = KSetStandardFile( STDIN, fileName );
if( ret<0 )
return false;
else
return true;
}
bool Process::SetStandardOutput( string fileName )
{
int ret;
ret = KSetStandardFile( STDOUT, fileName );
if( ret<0 )
return false;
else
return true;
}
bool Process::SetStandardError( string fileName )
{
int ret;
ret = KSetStandardFile( STDERR, fileName );
if( ret<0 )
return false;
else
return true;
}
}
namespace System{
/* for IProcess */
typedef struct tagIProcessModuleSymbol{
char name[256]; //符号名指针
int ordinal; //序号
t_32 address; //虚拟地址
}IProcessModuleSymbol, *PIProcessModuleSymbol;
#define IPROCESS_NUM_OF_MODULESYMBOL 1024 //最多1024个符号
typedef struct tagIProcessModuleInfo{
int moduleNo;
t_32 loadAddress;
t_32 size;
int type;
int memoryFlag;
t_32 entryPoint;
int count;
int exportNum;
int importNum;
IProcessModuleSymbol importList[IPROCESS_NUM_OF_MODULESYMBOL];
IProcessModuleSymbol exportList[IPROCESS_NUM_OF_MODULESYMBOL];
char fileName[MAX_PATHLEN];
}IProcessModuleInfo, *PIProcessModuleInfo;
enum _IPROC_COMMAND{
IPROC_GET_STATUS = 0,
IPROC_GET_PID,
IPROC_GET_TICKS,
IPROC_GET_EXITCODE,
IPROC_GET_CURRENTDIR,
IPROC_GET_ROOTDIR,
IPROC_GET_EXEFILE,
IPROC_GET_OPENFILENUM,
IPROC_GET_NEXTPROCESSID,
IPROC_GET_PARENTPROCESSID,
IPROC_GET_PREPROCESSID,
IPROC_GET_MODULENUM,
IPROC_GET_MODULEINFO,
IPROC_GET_STACKADDRESS,
IRPOC_GET_STACKSIZE,
IPROC_GET_ENTRYPOINT,
IPROC_GET_ARGUMENTNUM,
IPROC_GET_ARGUMENTVARIABLE,
IPROC_GET_ENVIRONMENTNUM,
IPROC_GET_ENVIRONMENTPARAMETER,
IPROC_GET_MEMORYINFO,
IPROC_GET_PROCESSES,
IPROC_GET_PROCESSNAME,
};
ProcessInfo::~ProcessInfo()
{
if( fno!=-1 )
{
Close();
}
}
int ProcessInfo::OpenProcess(string path)
{
if( fno!=-1 )
{
Close();
}
strProcName = path;
path = string("/iProcess/") + strProcName;
fno = KOpenFile( path, FILE_READ, FILE_FLAG_CREATE );
//DPRINT(" s %s", path.GetData());
if( fno<0 )
return false;
return true;
}
int ProcessInfo::OpenProcessById( int pid )
{
string path = string("PID:") + string().FromInteger( pid, 10 );
if( fno!=-1 )
{
Close();
}
path = string("/iProcess/") + path;
fno = KOpenFile( path, FILE_READ, FILE_FLAG_CREATE );
if( fno<0 ){
DPRINT("failed.");
return false;
}
//get name
cb.outBufferLength = PROCESSNAME_LEN+1;
cb.outBuffer = (void*)new char[PROCESSNAME_LEN+1];
KControlFile( fno, IPROC_GET_PROCESSNAME, (int)&cb );
strProcName = string((char*)cb.outBuffer);
delete[] (char*)cb.outBuffer;
//ok
return true;
}
int ProcessInfo::Close()
{
KCloseFile( fno );
fno = -1;
}
int ProcessInfo::Status()
{
KControlFile( fno, IPROC_GET_STATUS, (int)&cb );
return cb.info;
}
int ProcessInfo::Pid()
{
KControlFile( fno, IPROC_GET_PID, (int)&cb );
return cb.info;
}
string ProcessInfo::ProcessName()
{
return strProcName;
}
int ProcessInfo::Ticks()
{
KControlFile( fno, IPROC_GET_TICKS, (int)&cb );
return cb.info;
}
int ProcessInfo::ExitCode()
{
KControlFile( fno, IPROC_GET_EXITCODE, (int)&cb );
return cb.info;
}
string ProcessInfo::CurrentDirectory()
{
cb.outBufferLength = 1024;
cb.outBuffer = (void*)new char[cb.outBufferLength];
KControlFile( fno, IPROC_GET_CURRENTDIR, (int)&cb );
string strPath = string((char*)cb.outBuffer);
DPRINT("outBuffer: %s", cb.outBuffer );
delete[] (char*)cb.outBuffer;
return strPath;
}
string ProcessInfo::RootDirectory()
{
cb.outBufferLength = 1024;
cb.outBuffer = (void*)new char[cb.outBufferLength];
KControlFile( fno, IPROC_GET_ROOTDIR, (int)&cb );
string strPath = string((char*)cb.outBuffer);
delete[] (char*)cb.outBuffer;
return strPath;
}
string ProcessInfo::FileName()
{
cb.outBufferLength = 1024;
cb.outBuffer = (void*)new char[cb.outBufferLength];
KControlFile( fno, IPROC_GET_EXEFILE, (int)&cb );
string strPath = string((char*)cb.outBuffer);
delete[] (char*)cb.outBuffer;
return strPath;
}
int ProcessInfo::OpenFileCount()
{
KControlFile( fno, IPROC_GET_OPENFILENUM, (int)&cb );
return cb.info;
}
int ProcessInfo::NextProcessId()
{
KControlFile( fno, IPROC_GET_NEXTPROCESSID, (int)&cb );
return cb.info;
}
int ProcessInfo::ParentProcessId()
{
KControlFile( fno, IPROC_GET_PARENTPROCESSID, (int)&cb );
return cb.info;
}
int ProcessInfo::PreviousProcessId()
{
KControlFile( fno, IPROC_GET_PREPROCESSID, (int)&cb );
return cb.info;
}
int ProcessInfo::ModuleCount()
{
KControlFile( fno, IPROC_GET_MODULENUM, (int)&cb );
return cb.info;
}
int ProcessInfo::GetModuleInfo( )
{
}
int ProcessInfo::StackAddress()
{
KControlFile( fno, IPROC_GET_STACKADDRESS, (int)&cb );
return cb.info;
}
int ProcessInfo::StackSize()
{
KControlFile( fno, IRPOC_GET_STACKSIZE, (int)&cb );
return cb.info;
}
int ProcessInfo::EntryPoint()
{
KControlFile( fno, IPROC_GET_ENTRYPOINT, (int)&cb );
return cb.info;
}
int ProcessInfo::GetMemoryInfo( ProcessMemoryInfo& info )
{
cb.outBufferLength = sizeof(info);
cb.outBuffer = (void*)&info;
KControlFile( fno, IPROC_GET_MEMORYINFO, (int)&cb );
return true;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -