[轉]Windows多進程編程

轉自:https://blog.csdn.net/bxhj3014/article/details/2082255緩存

1、進程的概念安全

  進程是是一個正在運行的程序的實例,是系統分配資源的單位(線程是執行的單位),包括內存,打開的文件、處理機、外設等,進程由兩部分組成:數據結構

  1. 進程的內核對象:即咱們一般所講的PCB(進程控制塊),該結構只能由該內核訪問,他是操做系統用來管理進程的一個數據結構,操做系統經過該數據結構來感知和管理進程;它的成員負責維護進程的各類信息,包括進程的狀態(建立、就緒、運行、睡眠、掛起、僵死等)、消息隊列等;同時也是系統用來存放關於進程的統計信息的地方。多線程

  2. 進程的地址空間:包含全部可執行模塊或DLL模塊的代碼和數據,以及動態內存分配的空間,如線程堆棧和堆分配的空間。共有4G,0-2G爲用戶區,2-4G爲系統區。架構

2、進程的建立過程
      一、系統建立進程內核對象(PCB進程控制塊)。
      二、系統爲新進程建立虛擬地址空間,幫將可執行文件或任何須要的DLL文件的代碼和數據加載到該進程的地址空間。
      三、系統爲新進程的主線程建立一個線程內核對象(TCB線程控制塊)。
      四、經過執行C/C++運行期啓動代碼,該主線程開始運行。
函數


      注:在Windows環境下,儘可能用多線程而不是多進程。
spa

3、與進程相關的API操作系統

  一、建立進程
            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
.net

  二、打開進程 (獲取hProcessId對應的進程的內核對象句柄)
            HANDLE OpenProcess(
                    DWORD dwDesiredAccess, //訪問安全屬性
                    BOOL bInheritHandle,  //繼承屬性
                    DWORD hProcessId);   //進程ID
命令行

  三、終止進程
    (1)主線程的進入點函數返回
    (2)進程本身終止本身
                VOID ExitProcess(
                          UINT fuExitCode); //退出代碼
    (3)終止自身進程或其餘進程
                BOOL TerminateProcess(
                        HANDLE hProcess, //進程句柄
                        UINT fuExitCode); //退出代碼

  四、獲取進程的可執行文件或DLL對應的句柄
              HMODULE GetModuleHandle(
                      PCTSTR pszModule); //模塊名稱
              注:當參數傳NULL時獲取的是進程的地址空間中可執行文件的基地址。

  五、找出某個指定窗口的建立者(線程或進程),返回建立者的ID。哪一個線程建立了這個窗口,返回的就是這個線程的id號 (進程只有一個線程的話,那麼線程標誌符與進程標誌符就是指同一個標誌符)。
              HANDLE GetWindowThreadProcessId(
                      HWND hWnd,    //窗口句柄
                      LPDWORD lpdwProcessId); //指向建立該窗口的進程或線程的ID

  六、獲取進程的運行時間
              Bool GetProcessTimes(
                      HANDLE hProcess,   //進程句柄
                      PFILETIME pftCreationTime, //建立時間
                      PFILETIME pftExitTime, //退出時間
                      PFILETIME pftKernelTime, //內核時間
                      PFILETIME pftUserTime); //用戶時間
              注:返回的時間適用於某個進程中的全部線程(甚至已經終止運行的線程)。

  七、獲取當前進程的一個僞句柄
              HANDLE GetCurrentProcess();
               注:該函數獲取當前進程的僞句柄,一般狀況值爲-1,只能標識當前進程內核對象, 能夠複製,但不可繼承。沒必要調用CloseHandle()函數來關閉這個句柄。
                    僞句柄只能用於進程內部,若是你想獲得實際得句柄,在進程間進行通信,必須要進行轉化,調用DuplicateHandle,注意,得實句柄使用完成之後,你必需要調用CloseHandle去關閉.

  八、將進程的僞句柄轉換爲實句柄
              HANDLE DuplicateHandle(
                        GetCurrentProcess(),
                        GetCurrentProcess(),
                        GetCurrentProcess(),
                        &hProcess,
                        0,
                        FALSE ,
                        DUPLICATE_SAME_ACCESS); 

    注:實例句柄必需要調用CloseHandle()函數來關閉這個句柄,不然有句柄泄露。

  九、獲取當前進程ID
              DWORD GetCurrentProcessId();
  十、獲取進程優先級
              DWORD GetPriorityClass(HANDLE hProcess);

   十一、修改進程的優先級類
                  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:只要擁有進程的句柄和足夠的權限,就可以修改系統中運行的任何進程的優 先級類。

   十二、獲取指定進程已經打開的句柄的數量
              BOOL GetProcessHandleCount(
                        HANDLE hProcess,   //句柄
                        PDWORD pdwHandleCount); //句柄計數

  1三、獲取環境變量
              DWORD GetEnvironmentVariable(
                        LPCTSTR lpName, //環境變量的名字
                        LPTSTR lpValue, //存放返回字符串的緩衝區
                        DWORD cchValue); //緩衝區的大小
              注:返回值爲返回字符串的長度,當緩存不足時返回所需字符串的長度。經常使用的系統環境變量以下:

 1 WINDIR:                 //系統目錄 - C:\WINDOWS 
 2 SYSTEMROOT:             //系統目錄 - C:\WINDOWS 
 3 SYSTEMDRIVE:            //系統根目錄 - C: 
 4 HOMEDRIVE:              //當前用戶根目錄 - C: 
 5 USERPROFILE:            //當前用戶目錄 - C:\Users\Kandy 
 6 HOMEPATH:               //當前用戶路徑 - \Users\Kandy 
 7 TMP:                    //當前用戶臨時文件夾 - C:\Users\Kandy\AppData\Local\Temp 
 8 TEMP:                   //當前用戶臨時文件夾 - C:\Users\Kandy\AppData\Local\Temp 
 9 APPDATA:                //當前用戶數據文件夾 - C:\Users\Kandy\AppData\Roaming 
10 PROGRAMFILES:           //程序默認安裝目錄 - C:\Program Files (x86) 
11 COMMONPROGRAMFILES:     //文件通用目錄 - C:\Program Files (x86)\Common Files 
12 USERNAME:               //當前用戶名 - Kandy 
13 ALLUSERSPROFILE:        //全部用戶文件目錄 - C:\ProgramData 
14 OS:                     //操做系統名 - Windows_NT 
15 COMPUTERNAME:           //計算機名 - KANDY-PC 
16 NUMBER_OF_PROCESSORS:   //處理器個數 - 4 
17 PROCESSOR_ARCHITECTURE: //處理器芯片架構 - x86 
18 PROCESSOR_LEVEL:        //處理器型號 - 6 
19 PROCESSOR_REVISION:     //處理器修訂號 - 3c03 
20 USERDOMAIN:             //包含用戶賬號的域 - KANDY-PC 
21 COMSPEC:                //C:\WINDOWS\system32\cmd.exe 
22 PATHEXT:                //執行文件類型 - .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC 
23 PATH:                   //搜索路徑 

 

  1四、設置環境變量
              DWORD SetEnvironmentVariable(
                        LPCTSTR lpName, //環境變量的名字
                        LPCTSTR lpValue); //存放變量值字符串的緩衝區
              注:當環境變量lpName不存在,且lpValue不爲空時,將建立一個新的環境變量。

相關文章
相關標籤/搜索