Win32的進程和線程概念
進程是一個可執行的程序,由私有虛擬地址空間、代碼、數據和其他操作系統資源(如進程創建的文件、管道、同步對象等)組成。一個應用程序可以有一個或多個進程,一個進程可以有一個或多個線程,其中一個是主線程。
線程是操作系統分時調度分配CPU時間的基本實體。一個線程可以執行程序的任意部分的代碼,即使這部分代碼被另一個線程並發地執行;一個進程的所有線程共享它的虛擬地址空間、全局變量和操作系統資源。
之所以有線程這個概念,是因為以線程而不是進程為調度對象效率更高:
由於創建新進程必須加載代碼,而線程要執行的代碼已經被映射到進程的地址空間,所以創建、執行線程的速度比進程更快。
一個進程的所有線程共享進程的地址空間和全局變量,所以簡化了線程之間的通訊。
Win32的進程處理簡介
因為MFC沒有提供類處理進程,所以直接使用了Win32 API函數。
進程的創建
調用CreateProcess函數創建新的進程,運行指定的程序。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
);
其中:
lpApplicationName指向包含了要運行模塊名字的字符串。
lpCommandLine指向命令行字符串。
lpProcessAttributes描述進程的安全性屬性,NT下有用。
lpThreadAttributes描述進程初始線程(主線程)的安全性屬性,NT下有用。
bInHeritHandles表示子進程(被創建的進程)是否可以繼承父進程的句柄。可以繼承的句柄有線程句柄、有名或無名管道、互斥對象、事件、信號量、映像文件、普通文件和通訊端口等;還有一些句柄不能被繼承,如內存句柄、DLL實例句柄、GDI句柄、URER句柄等等。
子進程繼承的句柄由父進程通過命令行方式或者進程間通訊(IPC)方式由父進程傳遞給它。
dwCreationFlags表示創建進程的優先級類別和進程的類型。創建進程的類型分控制台進