当你 open/close 句柄时会发生什么?
What happen when you open/close a handle?
我学习了 C++。我对 "handle" 的想法感到困惑 这是我今天写的一个小片段:
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, a valid pid);
printf("%d", hProcess);
我发现每次输出都是“48”。这是有道理的,因为句柄是数组索引等资源的标识符。但即使我用其他标志替换 PROCESS_ALL_ACCESS,return 值仍然相同。打开句柄时到底发生了什么?操作系统如何知道句柄的访问权限?如果句柄是资源的标识符,为什么下面的代码不起作用?
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
在 OS 的某些数据结构中创建一个条目,进行初始化,并将句柄 (48
) 与条目相关联。
How does the Operating System know the access right of a handle of a specific handle?
它将它们存储在单独的数据结构中,句柄引用该数据结构(例如,如果它是 table,则句柄是 table 的索引)。句柄的值独立于与其关联的访问权限。
If handles are identifiers of resources, why doesn't the following code work?
HANDLE hProces = 48;
因为OS还没有添加对应的条目,所以句柄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 在对该答案的评论中所说,这实际上并不完全正确。 OS 为句柄维护一个计数器,它计算引用关联进程的实体数。 OpenProcess
和 CloseHandle
仅 increment/decrement 那个计数器,分别使句柄的多个“拥有者”成为可能。
我们可以猜测局部变量hProcess
没有被CloseHandle
函数改变。
您必须检查 CloseHandle
的 return 值才能知道此功能是否有效,但您不能依赖 hProcess
值。
我学习了 C++。我对 "handle" 的想法感到困惑 这是我今天写的一个小片段:
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, a valid pid);
printf("%d", hProcess);
我发现每次输出都是“48”。这是有道理的,因为句柄是数组索引等资源的标识符。但即使我用其他标志替换 PROCESS_ALL_ACCESS,return 值仍然相同。打开句柄时到底发生了什么?操作系统如何知道句柄的访问权限?如果句柄是资源的标识符,为什么下面的代码不起作用?
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
在 OS 的某些数据结构中创建一个条目,进行初始化,并将句柄 (48
) 与条目相关联。
How does the Operating System know the access right of a handle of a specific handle?
它将它们存储在单独的数据结构中,句柄引用该数据结构(例如,如果它是 table,则句柄是 table 的索引)。句柄的值独立于与其关联的访问权限。
If handles are identifiers of resources, why doesn't the following code work?
HANDLE hProces = 48;
因为OS还没有添加对应的条目,所以句柄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 在对该答案的评论中所说,这实际上并不完全正确。 OS 为句柄维护一个计数器,它计算引用关联进程的实体数。 OpenProcess
和 CloseHandle
仅 increment/decrement 那个计数器,分别使句柄的多个“拥有者”成为可能。
我们可以猜测局部变量hProcess
没有被CloseHandle
函数改变。
您必须检查 CloseHandle
的 return 值才能知道此功能是否有效,但您不能依赖 hProcess
值。