HANDLE是否类似于Linux中的文件描述符?

24

HANDLE和Linux中的文件描述符类似吗?据我所知,HANDLE用于处理Windows上的所有资源,如字体、图标、文件、设备等等,本质上只是一个指向存储特定资源数据的内存块的空指针。


2
是的,同样的事情。顺便说一句,它不是一个指针。 - Hans Passant
1
Windows HANDLE是内核对象的一种令牌(始终指向已加载到内存中的对象)。操作系统创建了内核对象和句柄之间的映射关系(传递给用户空间的)句柄是该映射关系的“键”。请注意,同一内核对象可以有不同的句柄(即使在同一进程中),只有当您关闭所有句柄时,操作系统才会销毁该对象。 - Marius Bancila
打印出HANDLE的值...你会发现它们不是指针。问题是,无论这些值代表什么,你都不应该关心。所以是的,它们都提供相同的功能,但使用不同的方法。 - James
2
但是你应该区分真正的内核句柄和其他语法上相似但不是内核对象的对象,例如窗口句柄(HWND)、GDI 对象(HICON、HGC、HBITMAP)、HMENU 等。真正的内核句柄是那些使用 CloseHandle() 关闭的简单说来。 - rodrigo
2
你是在问它们是否在概念上相似还是实现方式相似? - rve
@rve,既然你提到了,我认为如果我们都知道两种语言,那么每个人都会受益。 - Amumu
4个回答

21

是的,Windows 句柄与 Unix 文件描述符(FD)非常相似。

请注意,HANDLE 不是指向内存块的指针。尽管 HANDLEtypedefvoid *,但这只是为了使其更加不透明。实际上,HANDLE 是一个在表格中查找的索引,就像 FD 号码一样。

此博客文章探讨了一些相似之处和不同之处:http://lackingrhoticity.blogspot.com/2015/05/passing-fds-handles-between-processes.html


4

是的,它们在概念上相似。在Unix中,文件描述符将整数映射到其他对象(除文件外)的每个进程表中的指针。但是,文件描述符并不像Windows那样统一——某些内容存在于单独的“命名空间”中(例如进程计时器)。在这方面,Windows更加正交——无论是什么资源,CloseHandle始终会释放。


0
除了在Windows上,句柄指的是一个更广泛的概念之外。即使我们将讨论限制在文件句柄上,也存在显着的差异。在Windows上,C运行时库中有一个名为_open_osfhandle()的函数。它的目的是“将C运行时文件描述符与现有的操作系统文件句柄相关联。”也就是说,它是内核空间和C运行时空间之间的粘合函数。该函数的签名如下:
int _open_osfhandle (
    intptr_t osfhandle,
    int flags
);

文件句柄在Windows中比C语言中的文件描述符更加功能丰富,可以在创建文件句柄时使用CreateFileA(ANSI版本)或CreateFile(UTF16版本)进行配置,这反映了*Nix和Windows之间的设计差异。结果句柄携带所有这些信息及其影响。


-2

HANDLE是一个无类型指针。

typedef PVOID HANDLE;
typedef void *PVOID;

Windows数据类型


7
在得出结论时要小心。不完整的指针类型是用作不透明句柄的良好类型,因为它禁止算术运算 - 您无法像在存储在“int”变量中的unix文件描述符中那样意外添加两个句柄。但是,“HANDLE”不是内存地址。“typedef PVOID HANDLE;”甚至都不正确。(查找“STRICT”宏及其影响) - Ben Voigt
1
(请查看yic81在您提供的页面上的评论:“语句typedef HANDLE HINSTANCE;是完全错误的,就像许多其他typedef HANDLE一样。它们中的绝大多数现在都是DECLARE_HANDLE()结构。”他是正确的,MSDN页面是错误的。) - Ben Voigt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接