句柄是什么?一文带你了解!

简介: 今天又学习了一个装X概念——句柄,看字面意思,感觉跟某种器具有关,但实际上,这个词可不是用来打造家居用品的。

今天又学习了一个装X概念——句柄,看字面意思,感觉跟某种器具有关,但实际上,这个词可不是用来打造家居用品的。

相信不少人跟我一样,第一眼看到这个词,脑海里只有一个大大的问号。不过,没关系,我们可以一起学习,毕竟,装X路上永远没有止境。

一、官方一点儿的定义

在计算机科学中,句柄(Handle)是一种引用或标识对象的方式,它可以用来访问或操作底层系统资源。

不同的操作系统可能会有不同的实现和用途,下面我将以不同的操作系统为例来解释句柄的意义。

1. Windows操作系统

在 Windows 中,句柄是一种整数值,用于标识和访问系统对象或资源,如窗口、文件、设备等。

句柄充当了对象的唯一标识符,通过句柄可以对对象进行操作和管理。

示例代码(C++):

HWND hWnd = CreateWindow(L"Button", L"Click Me", WS_VISIBLE | WS_CHILD, 10, 10, 100, 30, hWndParent, NULL, hInstance, NULL);
if (hWnd != NULL) {
   
    // 使用句柄操作窗口对象
    ShowWindow(hWnd, SW_SHOW);
    UpdateWindow(hWnd);
    // ...
}

在上述代码中,通过 CreateWindow 函数创建一个按钮窗口,并将返回的句柄存储在 hWnd 变量中。然后,可以使用 hWnd 句柄来显示窗口、更新窗口等操作。

2. Linux操作系统

在 Linux 中,句柄通常称为文件描述符(File Descriptor),它是一个非负整数,用于标识打开的文件、设备、管道等。

Linux将所有的I/O操作都抽象为文件,并使用文件描述符来引用和操作这些文件。

示例代码(C):

int fd = open("file.txt", O_RDONLY);
if (fd != -1) {
   
    // 使用文件描述符读取文件内容
    char buffer[1024];
    ssize_t bytesRead = read(fd, buffer, sizeof(buffer));
    // ...
    close(fd);
}

上述代码中,通过 open 函数打开文件 file.txt,并将返回的文件描述符存储在 fd 变量中。然后,可以使用 fd 文件描述符来进行文件读取等操作。

3. macOS操作系统

在 macOS 中,句柄也称为文件描述符(File Descriptor),类似于 Linux 操作系统的文件描述符。它是一个整数,用于标识和访问打开的文件、设备等。

示例代码(Objective-C):

int fileDescriptor = open("/path/to/file.txt", O_RDONLY);
if (fileDescriptor != -1) {
    // 使用文件描述符读取文件内容
    char buffer[1024];
    ssize_t bytesRead = read(fileDescriptor, buffer, sizeof(buffer));
    // ...
    close(fileDescriptor);
}

在上述代码中,通过 open 函数打开文件 /path/to/file.txt,并将返回的文件描述符存储在 fileDescriptor 变量中。然后,可以使用 fileDescriptor 文件描述符来进行文件读取等操作。

总结起来,句柄(Handle)是一种在操作系统中用于标识、访问和操作系统资源的方式。

不同的操作系统有不同的实现和命名,如 Windows 中的句柄、Linux 和 macOS 中的文件描述符。句柄提供了一种抽象层,使得程序可以使用标识符来引用和操作底层资源,从而实现对系统资源的管理和控制。

二、通俗易懂的理解

可以把句柄理解为一个中间媒介,通过这个中间媒介可控制、操作某样东西。

举个例子。door handle 是指门把手,通过门把手可以去控制门,但 door handle 并非 door 本身,只是一个中间媒介。

又比如 knife handle 是刀柄,通过刀柄可以使用刀。

跟 door handle 类似,我们可以用 file handle 去操作 file, 但 file handle 并非 file 本身。这个 file handle 就被翻译成文件句柄,同理还有各种资源句柄。

三、为什么要发明句柄?

句柄的引入主要是为了解决以下几个问题:

  1. 资源标识:操作系统中存在各种类型的资源,如窗口、文件、设备等。为了标识和引用这些资源,需要一种统一的方式。句柄提供了一个唯一的标识符,可以用于识别特定类型的资源。

  2. 封装和抽象:句柄将底层资源的具体实现进行了封装和抽象,提供了一种更高层次的接口供应用程序使用。这样,应用程序不需要了解资源的内部细节和底层实现,只需要通过句柄进行操作。

  3. 安全性和隔离:句柄可以充当一种权限验证的机制,通过句柄来访问资源可以进行权限检查,从而保证了资源的安全性。此外,句柄还可以实现资源的隔离,不同句柄之间的资源操作互不影响。

  4. 跨平台和兼容性:不同的操作系统和平台有各自的资源管理方式和实现,句柄提供了一种统一的方式来操作不同平台上的资源。这样,应用程序可以在不同的操作系统上运行,并使用相同的句柄接口来访问资源。

总之,句柄提供了一种统一、封装、安全和跨平台的解决方案,使得应用程序可以更方便地操作和管理底层系统资源。

好了,看完以上内容你也许会感叹:句柄?这不就是个把手吗!但是,别小瞧这个把手,它可是万能的!

相关文章
|
7月前
|
IDE 开发工具 Python
[WinError 6] 句柄无效。
[WinError 6] 句柄无效。
151 1
|
3月前
|
缓存 JavaScript 安全
MethodHandle方法句柄使用分享
JDK 1.7 引入了 `MethodHandle` 类,优化了之前的反射机制性能问题。`MethodHandle` 提供了一种更高效的方法调用机制,通过 `MethodType` 和 `Lookup` 对象实现。具体流程包括:创建 `MethodType` 获取方法签名,通过 `Lookup` 查找方法对应的 `MethodHandle`,最后调用方法。此外,通过 `ConstantCallSite` 进一步优化性能,利用其不变性特点减少运行时开销。实验结果显示,使用 `ConstantCallSite` 显著提升了方法调用速度。
MethodHandle方法句柄使用分享
|
Java 编译器 API
JVM系列之:关于方法句柄的那些事
JVM系列之:关于方法句柄的那些事
248 1
JVM系列之:关于方法句柄的那些事
|
C#
C#中获得窗体的句柄
C#中获得窗体的句柄
257 0
|
存储 C++ 索引
C++中避免返回指向对象内部的句柄(handles)
C++中避免返回指向对象内部的句柄(handles)
168 0
|
机器学习/深度学习 分布式数据库 缓存
|
程序员 C++ 编译器
C++的引用和指针还有句柄的东西
使用句柄的另一个时机是想要将已经完成的东西含糊化的时候(有时用术语magic cookie也一样,就像这样,“软件传递一个magic cookie来唯一标识并定位适当的Fred对象”)。
1117 0