⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 process.cpp

📁 SimpleGraphicOperatingSystem 32位图形化操作系统 多进程 支持FAT32 详见www.sgos.net.cn
💻 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 + -