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

進程創建與終止全生命周期:從雙擊 EXE 到 ExitProcess

     編輯:關於C語言

Windows/Linux 統一啟動流程

  1. Shell 啟動:雙擊/命令行 → Shell 調用 CreateProcess (Win) / fork+exec (Linux)
  2. 進程內核對象:系統創建 EPROCESS/KPROCESS,引用計數 +1
  3. 地址空間:分配 4GB 用戶態虛擬地址空間 (32位)
  4. 映像加載:加載器映射 EXE 代碼/數據段,解析導入表加載依賴 DLL/so
  5. 主線程創建:創建主線程,分配棧、設置 TLS、指向入口點
  6. CRT 啟動代碼:mainCRTStartup / __libc_start_main 初始化堆、IO、全局構造函數
  7. 調用用戶入口:WinMain / main
  8. 程序運行:進入消息循環/業務邏輯
  9. 正常退出:main 返回 → CRT 清理(析構函數、atexit、IO 刷新) → ExitProcess / exit
  10. 內核清理:釋放地址空間、句柄、內核對象,引用計數歸零則銷毀

關鍵數據結構

  • PEB (Process Environment Block):進程參數、加載模塊鏈表、堆管理器、環境變量
  • TEB (Thread Environment Block):線程局部存儲、異常鏈、最後錯誤碼
  • VDM (Virtual DOS Machine):16位兼容環境(已棄用)

異常終止路徑

  • 未捕獲異常 → UnhandledExceptionFilter → 錯誤報告 → TerminateProcess
  • 其他進程調用 TerminateProcess → 直接內核清理,**不執行** CRT 清理、DLL DLL_PROCESS_DETACH
  • 控制台關閉 → Ctrl+C 信號 → 默認處理器調用 ExitProcess

Linux 差異點

  • fork() 複製父進程 → 子進程 execve() 替換映像
  • 無 PEB/TEB,用 task_struct、mm_struct、fs_struct
  • 動態鏈接器 ld-linux.so 負責共享庫加載
  • 信號機制更豐富(SIGCHLD, SIGTERM, SIGKILL 等)

工程啟示

  1. 全局對象構造/析構順序不確定,避免跨模塊依賴
  2. atexit/on_exit 註冊清理函數,但異常終止不執行
  3. 資源(句柄、內存、鎖)應採用 RAII/句柄封裝,依賴析構函數釋放
  4. 進程間通信優先用內核對象(事件、互斥量、管道),生命周期受內核管理

掌握進程生命周期,能從根上理解程序啟動慢、退出卡、DLL 卸載順序、全局變量初始化等疑難雜症。

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