首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Windows CloseHandle 與 TerminateProcess 的區別:關閉句柄 ≠ 結束進程

     編輯:程式設計疑難解答

代碼嘗試用 `CloseHandle` 關閉進程,實際 `CloseHandle` 僅釋放句柄引用,不終止進程。結束進程需用 `TerminateProcess`。

核心概念

錯誤代碼邏輯


HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, pid);
CloseHandle(hProcess);  // 僅歸還鑰匙,進程仍在運行
// 應該:
TerminateProcess(hProcess, 0);
CloseHandle(hProcess);  // 結束後再關閉句柄

正確查找並結束進程流程


// 1. 快照遍歷進程
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 pe32 = { sizeof(pe32) };
if (Process32First(hSnap, &pe32)) {
  do {
    if (_tcscmp(pe32.szExeFile, targetName) == 0) {
      // 2. 打開進程獲取終止權限句柄
      HANDLE hProc = OpenProcess(PROCESS_TERMINATE, FALSE, pe32.th32ProcessID);
      if (hProc) {
        // 3. 終止進程
        TerminateProcess(hProc, 0);
        // 4. 關閉句柄
        CloseHandle(hProc);
      }
    }
  } while (Process32Next(hSnap, &pe32));
}
CloseHandle(hSnap);

關鍵點

  • `CloseHandle` 釋放的是應用層的句柄對象,不影響內核進程對象。
  • 進程結束需內核介入(`TerminateProcess` 或 `ExitProcess`)。
  • 句柄引用計數歸零時,內核自動釋放內核對象,但進程仍運行直至主線程退出或被終止。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
API作用比喻
OpenProcess獲取進程句柄(引用)向管理器申請一把鑰匙
CloseHandle釋放句柄引用,減少引用計數歸還鑰匙給管理器
TerminateProcess強制結束進程執行銷毀房間(進程本體)