c++ - 如何检查 HANDLE 是否有效?

标签 c++ c winapi port handle

在 C++ 中,我打开了一个具有 HANDLE 的串行端口。由于端口可能会被外部应用程序关闭,在读取数据之前如何验证 HANDLE 是否仍然有效?

我认为可以通过根据合适的 API 函数检查 HANDLE 来完成,但是哪个? 谢谢。

最佳答案

检查句柄是否“有效”是错误的。你需要有更好的方法来处理这个问题。

问题是,一旦句柄被关闭,相同的句柄值可以由不同的东西的新打开生成,并且您的测试可能会说句柄是有效的,但您并没有在您认为的文件上操作是。

例如,考虑这个序列:

  1. handle 打开,实际值为0x1234
  2. 使用句柄,传递值
  3. handle 已关闭。
  4. 程序的其他部分打开一个文件,得到句柄值 0x1234
  5. 原始句柄值是“检查有效性”,并通过。
  6. 使用了句柄,操作了错误的文件。

因此,如果这是您的流程,您需要跟踪哪些句柄有效,哪些无效。如果您从其他进程获得句柄,它将使用 DuplicateHandle() 将其放入您的进程中。在这种情况下,您应该管理句柄的生命周期,而源进程不应该为您这样做。如果您的句柄正在从另一个进程关闭,我假设您是这样做的人,并且您需要处理簿记。

关于c++ - 如何检查 HANDLE 是否有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5603625/

相关文章:

c++ - GetPrivateProfileInt- 只读取默认值

c++ - 'private'访问修饰符是否给了编译器更大的优化空间?

c++ - 为什么将 shared_ptr<T> 作为 shared_ptr<const T> 返回会导致 "returning address of temporary"警告?

c++ - 将 POD 实现为自定义类类型转换

创建 UNIX Shell,对 fork 和 child pid 感到困惑?

mysql - C 和 Mysql 中的链接错误

c - C编译器引用实现

python - 创建单个 python 可执行模块

c++ - 从模板化类版本控制派生类的序列化

c - 在 XCode 中复制目标时,新文件中的更改仍然会出现在旧文件中