第4章 進程:
1. 一般將進程定義成一個正在啟動並執行程式的一個執行個體,它由以下兩部分構成。
一個核心對象,作業系統用它來管理進程。核心對象也是系統儲存進程統計資訊的地方。
一個地址空間,其中包含所有可執行檔或DLL模組的代碼和資料。
2. 每個進程至少要有一個線程來執行進程地址空間包含的代碼。如果沒有線程要執行進程地址空間包含的代碼,進程就失去了繼續存在的理由,系統會自動銷毀進程及其地址空間。
3. 在VS開發過程中通過連結器開關/SUBSYSTEM:CONSOLE或/SUBSYSTEM:WINDOWS設定是載入應用台程式還是視窗。
4. windows應用程式的進入點函數有四種(是否載入應用台程式,是否使用Unicode,兩個2維選項組成四種組合)。分別是:
_tWinMain(WinMain),嵌入可執行檔的啟動函數是 WinMainCRTStartup
_tWinMain(wWinMain),嵌入可執行檔的啟動函數是 wWinMainCRTStartup
_tmain(Main),嵌入可執行檔的啟動函數是 mainCRTStartup
_tmain(Wmain),嵌入可執行檔的啟動函數是 wmainCRTStartup
連結時根據上面連結器開關選擇應的入口函數來做連結。
5. 上述啟動函數的源碼在crtexe.c檔案中,主要的用途總結如下:
擷取指向新進程的完整命令列的一個指標。
擷取指向新進程的環境變數的一個指標。
初始化C/C++運行庫的合璧變數。如果包含了StdLib.h,我們的代碼就可以訪問這些變數。
初始化C運行庫記憶體配置函數(malloc,alloc)和其他底層I/O常式使用的堆(heap)。
調用所有全域和靜態C++類對象的建構函式。
完成以上的初始化工作以後就調用應用程式的進入點函數。
6. 提到記憶體泄露的檢測方法,已經轉載文章在本部落格中。
7. 進程執行個體控制代碼的擷取和使用:GetModuleHandle, GetModuleHandlerEx,GetModuleFileName
8. 進程命令列的擷取:GetCommandLine,CommandLineToArgvW
9. 進程環境變數:GetEnvironmentStrings,FreeEnvironmentStrings,GetEnvironmentVariable,SetEnvironmentVariable
10. 進程相關路徑的函數:GetCurrentDirectory, GetFullPathName
11. 建立進程函數CreateProcess,本章最重要的函數。它的運行機理:
a. 系統建立一個進程核心對象;
b. 系統為進程建立一個虛擬位址空間,載入可執行檔的代碼及資料到這個虛擬位址空間;
c. 系統為新進程的主線程建立一個線程核心對象;
d. 主線程執行C/C++運行時的啟動常式,執行應用程式入口;
e. 如果建立新進程和主線程成功,返回TRUE。
參數及說明請參考:http://social.msdn.microsoft.com/search/en-us/windows/desktop?query=CreateProcess&Refinement=181
參數的使用是本章的關鍵。
12. 終止進程函數 ExitProcess,是不安全的函數,不要在程式中調用。其過程可以使用建構函式和解構函式列印是否調用來證明。
13. 終止進程函數 TerminateProcess,是安全函數,可以使用。
14. 子進程在建立時擁有父進程的ID,但如果父進程終止了,此ID就沒意義了,所以如果沒有同步訊號表明父進程沒有結束,不要使用這個ID來做事情。
15. 管理員以標準使用者權限運行時:這些內容是windows vista及win7的新增內容,也是相對獨立而重要的,另開一篇總結。
書上得來終覺淺,緣知此事要躬行。