首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Windows 核心編程:進程創建、終止與內核對象全生命周期解析

     編輯:關於C語言

應用程序類型與入口點

入口點函數對應表

啟動函數:入口點前由 CRT 執行初始化(堆/IO/全局構造),入口點返回後執行清理(析構/IO刷新)再調用 ExitProcess。

CreateProcess 完整原型與參數詳解

BOOL CreateProcess(
    LPCWSTR lpApplicationName,      // 可執行文件路徑(NULL 時從命令行解析)
    LPWSTR lpCommandLine,           // 命令行字符串(可修改)
    LPSECURITY_ATTRIBUTES lpProcessAttributes,  // 進程安全屬性(NULL=默認不可繼承)
    LPSECURITY_ATTRIBUTES lpThreadAttributes,   // 主線程安全屬性
    BOOL bInheritHandles,           // TRUE=子進程繼承可繼承句柄
    DWORD dwCreationFlags,          // 創建標誌組合
    LPVOID lpEnvironment,           // 環境塊指針(NULL=繼承父進程)
    LPCWSTR lpCurrentDirectory,     // 當前目錄(NULL=繼承父進程)
    LPSTARTUPINFOW lpStartupInfo,   // 啟動信息(窗口狀態/標準句柄/桌面)
    LPPROCESS_INFORMATION lpProcessInformation  // 輸出:進程/線程句柄及ID
);

關鍵標誌 dwCreationFlags

類型全稱入口點函數字符集
GUIGraphical User InterfaceWinMain / wWinMainANSI / Unicode
CUIConsole User Interfacemain / wmainANSI / Unicode
標誌含義
CREATE_SUSPENDED主線程掛起創建,需 ResumeThread 繼續
DETACHED_PROCESS無控制台
CREATE_NEW_CONSOLE新建控制台窗口
CREATE_UNICODE_ENVIRONMENT環境塊用 Unicode
DEBUG_PROCESS / DEBUG_ONLY_THIS_PROCESS調試器模式
IDLE_PRIORITY_CLASS 等優先級類別

進程創建內部流程

  1. 創建進程內核對象(引用計數 1),非進程本身,而是管理數據結構
  2. 分配虛擬地址空間,映射 EXE/DLL 代碼數據
  3. 創建主線程內核對象(引用計數 1)
  4. 主線程執行 CRT 啟動代碼 → 入口點函數
  5. CreateProcess 返回 TRUE 不代表初始化完成,DLL 載入失敗會導致進程悄無聲息終止,父進程無感知

進程終止四種方式

方式觸發者清理行為退出碼來源
主線程返回入口點 returnC++析構、CRT清理、ExitProcess入口點返回值
ExitProcess任意線程無 C++ 析構、CRT 無清理、直接終止參數 fuExitCode
TerminateProcess其他進程無任何用戶態清理、內核強制回收參數 uExitCode
所有線程結束系統檢測最後一個線程退出碼最後線程退出碼

最佳實踐

  • 主線程務必用 return,保證 RAII 與 CRT 正確清理
  • 主線程禁用 ExitProcess,繞過 C++ 析構
  • 極少調用 TerminateProcess,僅用於無響應進程強殺

系統終止後處理流程

  1. 終止殘留線程
  2. 釋放用戶/GDI 對象,關閉內核對象句柄(其他進程持有的除外)
  3. 退出碼從 STILL_ACTIVE(259) 變為實際值
  4. 進程內核對象置有信號狀態
  5. 內核對象引用計數 -1(歸零時銷毀對象)

本文整理自「賣萌程序員」博客,原文地址:https://7677869.blog.51cto.com/7667869/1297643

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved