当你打开/关闭把手时会发生什么
What happen when you open/close a 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("%dn", hProcess);
hProcess
只是一个关联进程的值。句柄本身由操作系统管理并与进程关联。
当你打开把手时,到底发生了什么?
OpenProcess
在操作系统的某些数据结构中创建一个条目,执行初始化工作,并将句柄(48
)与该条目关联。
操作系统如何知道特定句柄的句柄的访问权限?
它将它们存储在一个单独的数据结构中,句柄引用该数据结构(例如,如果它是一个表,则句柄是该表的索引)。句柄的值独立于与其关联的访问权限
如果句柄是资源的标识符,为什么下面的代码不起作用?
HANDLE hProces = 48;
因为操作系统还没有添加相应的条目,所以句柄48
与任何内容都没有关联。
举个例子,如果你做
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, a valid pid);
HANDLE alias = hProcess;
CCD_ 5将指代与CCD_ 6相同的过程。
为什么输出仍然是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在对这个答案的评论中所说,事实并非如此。操作系统为句柄维护一个计数器,用于统计引用关联进程的实体数。OpenProcess
和CloseHandle
仅分别递增/递减该计数器;拥有者";可能的手柄。
我们可以猜测局部变量hProcess
不会被CloseHandle
函数更改。你必须检查CloseHandle
的返回值才能知道这个函数是否有效,但你不能依赖hProcess
的值。
- 什么 /可以/ 你从一个函数返回. 并期望它在到达时还活着?
- 为什么当你将函数的返回值乘以零时它不会短路?
- 当你只使用 return 时,函数返回什么类型;在 c++ 中
- 当你只有它的指针时,如何将参数传递给函数?
- 停止线程的方法是什么(当我直接从Qthread继承时)
- 如何处理迭代器::d ifference_type,当你无法测量差异时
- 只有当你在QML中点击黑莓级联模拟器时,你如何回应点击文本字段
- 线x=是什么!你的意思是
- 当你通过引用返回对象时,你什么时候需要担心对象会被破坏
- Qt:当你没有对QThread进行子类化时,如何清理它
- 嗨,我只是想知道这个错误意味着什么.当我尝试构建时,
- 为什么当你不定义函数时,你会得到一个链接器错误而不是编译器?
- "int *(&arry)[10] = ptrs;"的含义是什么?你怎么读这样的东西?
- 当你有一个像 ::lower 这样的参数时,这在C++中是什么意思
- C++,当你创建多个类时,你是否应该将它们放在自己的 .cpp/.h 对中
- 当你打开/关闭把手时会发生什么
- 当你复制一个随机数引擎和随机数分布时会发生什么?
- 当你在 std::vector 上调用 data() 时会发生什么<bool>?
- 当你将一个NSMutable*对象传递给一个接受ns*对象的方法时会发生什么
- 当你使用模板时会发生什么