一、進程的概念
進程是是一個正在啟動並執行程式的執行個體(飄~~~),是系統分配資源的單位(線程是執行的單位),包括記憶體,開啟的檔案、處理機、外設等,進程由兩部分組成:
1、進程的核心對象:即我們通常所講的PCB(進程式控制制塊),該結構只能由該核心訪問,他是作業系統用來管理進程的一個資料結構,作業系統通過該資料結構來感知和管理進程;它的成員負責維護進程的各種資訊,包括進程的狀態(建立、就緒、運行、睡眠、掛起、僵死等)、訊息佇列等;同時也是系統用來存放關於進程的統計資訊的地方。
註:具體結構參照Linux的task_struct資料結構。
2、進程的地址空間:包含所有可執行模組或DLL模組的代碼和資料,以及動態記憶體分配的空間,如線程堆棧和堆分配的空間。共有4G,0-2G為使用者區,2-4G為系統區。
二、進程的建立過程
1、系統建立進程核心對象(PCB進程式控制制塊)。
2、系統為新進程建立虛擬位址空間,幫將可執行檔或任何必要的DLL檔案的代碼和資料載入到該進程的地址空間。
3、系統為新進程的主線程建立一個線程核心對象(TCB線程式控制制塊)。
4、通過執行C/C++運行期啟動代碼,該主線程開始運行。
註:在Windows環境下,盡量用多線程而不是多進程。
三、與進程相關的API
1、建立進程
BOOL CreateProcess(
PCTSTR psApplicationName, //可執行檔的名字
PTSTR pszCommandLine, //命令列字串
PSECURITY_ATTRIBUTES psaProcess, //進程對象的安全性
PSECURITY_ATTRIBUTES psaThread, //線程對象的安全性
BOOL bInheritHandles, //控制代碼可繼承性
DWORD fdwCreate, //標識符(優先順序)
PVOID pvEnvironment, //指向環境字串
PCTSTR pszCurDir, //子進程目前的目錄
PSTARTUPINFO psiStartInfo,
PPROCESS_INFORMATION ppiProcInfo); //進程線程控制代碼及ID
2、開啟進程
HANDLE OpenProcess(
DWORD dwDesiredAccess, //訪問安全屬性
BOOL bInheritHandle, //繼承屬性
DWORD hProcessId); //進程ID
註:擷取hPronessId指定的進程的核心對象的控制代碼
3、終止進程
(1)、主線程的進入點函數返回
(2)、進程自己終止自己
VOID ExitProcess(
UINT fuExitCode); //結束代碼
(3)、終止自身進程或其他進程
BOOL TerminateProcess(
HANDLE hProcess, //進程控制代碼
UINT fuExitCode); //結束代碼
三、與進程相關的API
4、擷取進程的可執行檔或DLL對應的控制代碼
HMODULE GetModuleHandle(
PCTSTR pszModule); //模組名稱
註:當參數傳NULL時擷取的是進程的地址空間中可執行檔的基地址。
5、擷取與指定視窗關聯在一起的一個進程和線程標識符
HANDLE GetWindowThreadProcessId(
HWND hWnd, //視窗控制代碼
LPDWORD lpdwProcessId); //與該視窗相關的進程ID
6、擷取進程的已耗用時間
Bool GetProcessTimes(
HANDLE hProcess, //進程控制代碼
PFILETIME pftCreationTime, //建立時間
PFILETIME pftExitTime, //退出時間
PFILETIME pftKernelTime, //核心程式的時間
PFILETIME pftUserTime); //使用者時間
註:返回的時間適用於某個進程中的所有線程(甚至已經終止啟動並執行線程)。
7、擷取當前進程的一個偽控制代碼
HANDLE GetCurrentProcess();
註:該函數擷取當前進程的偽控制代碼,通常情況值為-1,只能標識當前進程核心對象,
可以複製,但不可繼承。不必調用CloseHandle()函數來關閉這個控制代碼。
8、將進程的偽控制代碼轉換為實控制代碼
HANDLE DuplicateHandle(
GetCurrentProcess(),
GetCurrentProcess(),
GetCurrentProcess(),
&hProcess,
0,
FALSE ,
DUPLICATE_SAME_ACCESS);
9、擷取當前進程ID
DWORD GetCurrentProcessId();
10、擷取進程優先順序
DWORD GetPriorityClass(
HANDLE hProcess);
11、修改進程的優先順序類
BOOL SetPriorityClass(
HANDLE hProcess, //進程控制代碼
DWORD fdwPriority); //相對進程優先順序
注1:相對線程優先順序
即時: REALTIME_PRIORITY_CLASS
高: HIGH_PRIORITY_CLASS
高於正常; ABOVE_NORMAL_PRIORITY_CLASS
正常: NORMAL_PRIORITY_CLASS
低於正常: BELOW_NORMAL_PRIORITY_CLASS
空閑: IDLE_PRIORITY_CLASS
注2:只要擁有進程的控制代碼和足夠的許可權,就能夠修改系統中啟動並執行任何進程的優
先級類。
12、擷取進程控制代碼計數
BOOL GetProcessHandleCount(
HANDLE hProcess, //控制代碼
PDWORD pdwHandleCount); //控制代碼計數
13、擷取環境塊
DWORD GetEnvironmentVariable(
LPCTSTR lpName, //環境變數的名字
LPTSTR lpValue, //存放返回字串的緩衝區
DWORD cchValue); //緩衝區的大小
註:傳回值為返回字串的長度,當緩衝不足時返回所需字串的長度
14、設定環境塊
BOOL SetEnvironmentVariable(
LPCTSTR lpName, //環境變數的名字
LPCTSTR lpValue); //存放變數值字串的緩衝區