Windows via C/C++: 子進程

當你編寫程序時,可能想讓一段代碼獨立運行,比如調用函數或子例程,此時調用者必須等待函數或子例程返回,在大多數情況下,我們需要這種單任務的同步。另一種可選的方法將這段獨立作業封裝到新的線程中執行,此時我們就可以獲得多任務的特性 ,這項技術非常有用,但是當你要獲得新線程的執行結果時會引發同步問題。

另一種方法是創建一個子進程完成任務。當任務比較複雜時,如果使用多線程,可能會不小心破壞進程空間的數據,此時需要良 好的同步機制確保數據完整性。使用子進程則完全不用擔心這種情況,不同進程的地址空間是相互獨立的。然而,有些情況子進程需要讀 寫父進程地址空間的數據,Windows提供了幾種進程間通信的方法:動態數據交換(Dynamic Data Exchange-DDE)、OLE、管道、 郵件槽等等,其中最常見的方式是內存映射文件,我們會在第十七章討論內存映射。

創建子進程以後,如果你需要等待它的執行結果,可以使用類似下面的代碼:
上面的代碼中,我們使用WaitForSingleObject函數等待進程執行完畢:
第九章會講到WaitForSingleObject的詳細用法,現在你只需要知道該函數會一直阻塞直到hObject定義的對象狀態變爲“激發” (signaled),線程/進程對象在終止時變爲“激發”狀態。WaitForSingleObject返回後,你可以調用GetExitCodeProcess獲得其退出 碼。最後的CloseHandle調用會使進程對象引用計數減1,在上面的代碼中,操作系統會銷燬內核對象。

你可能會注意到示例中的CreateProcess函數返回時我們就關閉了新進程主線程的句柄,這不會導致對應的線程終止,只是其主線 程內核對象的引用計數減1。這樣做的好處在於操作系統可以在適當的時候銷燬該對象,否則除非進程終止,子進程主線程對象引用計數數永遠不會清0,這樣操作系統也無法回收其佔用的內存。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章