c++ - 打开/关闭 handle 时会发生什么?

标签 c++ winapi visual-c++ handle

我学习了 C++。我对“处理”的概念感到困惑 这是我今天写的一个小片段:

    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, a valid pid);
    printf("%d", hProcess);

我发现每次输出都是“48”。这是有道理的,因为句柄是数组索引等资源的标识符。但即使我将 PROCESS_ALL_ACCESS 替换为其他标志,返回值仍然相同。打开句柄时到底发生了什么?操作系统如何知道句柄的访问权限?如果句柄是资源的标识符,为什么下面的代码不起作用?

    HANDLE hProces = 48;

此外,调用 CloseHandle(hProcess) 时发生了什么?为什么输出还是48?

    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, a valid pid);
    CloseHandle(hProcess);
    printf("%d\n", hProcess);

最佳答案

hProcess 只是一个关联进程的值。句柄本身由操作系统管理并与进程相关联。

What exactly happened when you open a handle?

OpenProcess 在操作系统的某些数据结构中创建一个条目,进行初始化,并将句柄 (48) 与该条目相关联。

How does the Operating System know the access right of a handle of a specific handle?

它将它们存储在一个单独的数据结构中,句柄引用该数据结构(例如,如果它是一个表,则句柄是该表的索引)。句柄的值独立于与其关联的访问权限。

If handles are identifiers of resources, why doesn't the following code work?

HANDLE hProces = 48;

因为操作系统还没有添加相应的条目,所以句柄48没有关联任何东西。

举个例子,如果你这样做了

HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, a valid pid);
HANDLE alias = hProcess;

alias 将引用与 hProcess 相同的进程。

why is the output still 48?

CloseHandle 从数据结构中删除该条目并解除句柄与条目的关联。1
打印 hProcess 是明确定义的。它只是一个值,未通过 CloseHandle 进行扩充。仅删除关联的条目,并删除该条目的句柄 (48) 的含义


我想你可以这样想象整个事情:有一个数据结构,它包含你的进程的数据,其中包含打开进程的数据。句柄是指向这些进程条目的“指针”。如果存在进程条目,则句柄指向某个众所周知的进程。但是,如果不是,则句柄指向进程。就像指针一样:

char* ptr;
{
    char c = 'a'; /* similar to the call to OpenProcess itsself */
    ptr = &c;    /* similar to hProcess initialized with the return value
                  * of OpenProcess */
}    /* c goes out of scope, similar to CloseHandle */

1 正如@IInspectable 在此答案的评论中所说,这实际上并不完全正确。操作系统为句柄维护一个计数器,它计算引用关联进程的实体数。 OpenProcessCloseHandle 仅递增/递减该计数器,分别使句柄的多个“拥有者”成为可能。

关于c++ - 打开/关闭 handle 时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33872859/

相关文章:

c++ - 如何让项目将其构建输出与 Scons 放在同一目录中?

winapi - 如何在powershell中更改当前的键盘布局?

C++ Win32 API 控制消息

C++ LNK1120 和 LNK2019 错误 : "unresolved external symbol WinMain@16"

c++ - 在本地类中定义 lambda 时,C2326 函数无法访问 'bar'

c++ - 如何在 C++ 中将用户输入限制为数字和字母

c++ - 我在检查字符串时得到 "Invalid utf 8 error",但是当我使用 std::cout 时它似乎是正确的

c++ - 在资源 DLL 之间切换

c++ - clang 格式:IncludeIsMainRegex 不起作用

java - 如何使用 java 在 Windows 中查找当前打开的应用程序(在任务栏上)的名称?