为什么这段代码在空句柄上调用CloseHandle?

2024-09-27 04:26:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试重新创建psutil项目上的一些功能(https://code.google.com/p/psutil/)使用ctypes。使用psutil对于我想要的东西来说是一种过激行为,它只是简单地检查给定的pid是否正在运行。在

我试图重新创建的代码段是pid_is_running function。在

int
pid_is_running(DWORD pid)
{
    HANDLE hProcess;
    DWORD exitCode;

    // Special case for PID 0 System Idle Process
    if (pid == 0) {
        return 1;
    }

    if (pid < 0) {
        return 0;
    }

    hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
                           FALSE, pid);
    if (NULL == hProcess) {
        // invalid parameter is no such process
        if (GetLastError() == ERROR_INVALID_PARAMETER) {
            CloseHandle(hProcess);
            return 0;
        }

        // access denied obviously means there's a process to deny access to...
        if (GetLastError() == ERROR_ACCESS_DENIED) {
            CloseHandle(hProcess);
            return 1;
        }

        CloseHandle(hProcess);
        PyErr_SetFromWindowsErr(0);
        return -1;
    }

    if (GetExitCodeProcess(hProcess, &exitCode)) {
        CloseHandle(hProcess);
        return (exitCode == STILL_ACTIVE);
    }

    // access denied means there's a process there so we'll assume it's running
    if (GetLastError() == ERROR_ACCESS_DENIED) {
        CloseHandle(hProcess);
        return 1;
    }

    PyErr_SetFromWindowsErr(0);
    CloseHandle(hProcess);
    return -1;
}

我不明白为什么代码要关闭一个空句柄。这真的有必要吗?它是错误的还是可能导致错误?在

我也将非常感谢您对我目前所能提出的任何意见

^{pr2}$

Tags: returnifaccessiserrorprocesspidrunning
1条回答
网友
1楼 · 发布于 2024-09-27 04:26:57

它可能是自动生成的,以关闭每个返回路径。即使是C程序员也没有愚蠢到可以在每一条路径上释放资源,而是使用基于goto的清理习惯用法。在

当然了

compile against ntdll functions not exposted in the API

可能表示代码使用内部NT API函数,这些函数在将来的任何时候都会更改并破坏代码。在

相关问题 更多 >

    热门问题