程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> vc++中進程與多進程管理的方法

vc++中進程與多進程管理的方法

編輯:vc教程

  進程是當前操作系統下一個被加載到內存的、正在運行的應用程序的實例。每一個進程都是由內核對象和地址空間所組成的,內核對象可以讓系統在其內存放有關進程的統計信息並使系統能夠以此來管理進程,而地址空間則包括了所有程序模塊的代碼和數據以及線程堆棧、堆分配空間等動態分配的空間。進程僅僅是一個存在,是不能獨自完成任何操作的,必須擁有至少一個在其環境下運行的線程,並由其負責執行在進程地址空間內的代碼。在進程啟動的同時即同時啟動了一個線程,該線程被稱作主線程或是執行線程,由此線程可以繼續創建子線程。如果主線程退出,那麼進程也就沒有存在的可能了,系統將自動撤消該進程並完成對其地址空間的釋放。

  加載到進程地址空間的每一個可執行文件或動態鏈接庫文件的映象都會被分配一個與之相關聯的全局唯一的實例句柄(Hinstance)。該實例句柄實際是一個記錄有進程加載位置的基本內存地址。進程的實例句柄在程序入口函數WinMain()中通過第一個參數HINSTANCE hinstExe傳遞,其實際值即為進程所使用的基本地址空間的地址。對於VC++鏈接程序所鏈接產生的程序,其默認的基本地址空間地址為0x00400000,如沒有必要一般不要修改該值。在程序中,可以通過GetModuleHandle()函數得到指定模塊所使用的基本地址空間。
  子進程的創建

  進程的創建通過CreateProcess()函數來實現,CreateProcess()通過創建一個新的進程及在其地址空間內運行的主線程來啟動並運行一個新的程序。具體的,在執行CreateProcess()函數時,首先由操作系統負責創建一個進程內核對象,初始化計數為1,並立即為新進程創建一塊虛擬地址空間。隨後將可執行文件或其他任何必要的動態鏈接庫文件的代碼和數據裝載到該地址空間中。在創建主線程時,也是首先由系統負責創建一個線程內核對象,並初始化為1。最後啟動主線程並執行進程的入口函數WinMain(),完成對進程和執行線程的創建。

  CreateProcess()函數的原型聲明如下:

BOOL CreateProcess(
 LPCTSTR lpApplicationName, // 可執行模塊名
 LPTSTR lpCommandLine, // 命令行字符串
 LPSECURITY_ATTRIBUTES lpProcessAttributes, // 進程的安全屬性
 LPSECURITY_ATTRIBUTES lpThreadAttributes, // 線程的安全屬性
 BOOL bInheritHandles, // 句柄繼承標志
 DWORD dwCreationFlags, // 創建標志
 LPVOID lpEnvironment, // 指向新的環境塊的指針
 LPCTSTR lpCurrentDirectory, // 指向當前目錄名的指針
 LPSTARTUPINFO lpStartupInfo, // 指向啟動信息結構的指針
 LPPROCESS_INFORMATION lpProcessInformation // 指向進程信息結構的指針
);

  在程序設計時,某一個具體的功能模塊可以通過函數或是線程等不同的形式來實現。對於同一進程而言,這些函數、線程都是存在於同一個地址空間下的,而且在執行時,大多只對與其相關的一些數據進行處理。如果算法存在某種錯誤,將有可能破壞與其同處一個地址空間的其他一些重要內容,這將造成比較嚴重的後果。為保護地址空間中的內容可以考慮將那些需要對地址空間中的數據進行訪問的操作部分放到另外一個進程的地址空間中運行,並且只允許其訪問原進程地址空間中的相關數據。具體的,可在進程中通過CreateProcess()函數去創建一個子進程,子進程在全部處理過程中只對父進程地址空間中的相關數據進行訪問,從而可以保護父進程地址空間中與當前子進程執行任務無關的全部數據。對於這種情況,子進程所體現出來的作用同函數和線程比較相似,可以看成是父進程在運行期間的一個過程。為此,需要由父進程來掌握子進程的啟動、執行和退出。下面這段代碼即展示了此過程:

// 臨時變量
CString sCommandLine;
char cWindowsDirectory[MAX_PATH];
char cCommandLine[MAX_PATH];
DWORD dwExitCode;
PROCESS_INFORMATION pi;
STARTUPINFO si = {sizeof(si)};
// 得到Windows目錄
GetWindowsDirectory(cWindowsDirectory, MAX_PATH);
// 啟動"記事本"程序的命令行
sCommandLine = CString(cWindowsDirectory) + "NotePad.exe";
::strcpy(cCommandLine, sCommandLine);
// 啟動"記事本"作為子進程
BOOL ret = CreateProcess(NULL, cCommandLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
if (ret) {
 // 關閉子進程的主線程句柄
 CloseHandle(pi.hThread);
 // 等待子進程的退出
 WaitForSingleObject(pi.hProcess, INFINITE);
 // 獲取子進程的退出碼
 GetExitCodeProcess(pi.hProcess, &dwExitCode);
 // 關閉子進程句柄
 CloseHandle(pi.hProcess);
}

  • 首頁
  • 上一頁
  • 1
  • 2
  • 3
  • 下一頁
  • 尾頁
  • 共3頁
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved