丰富的线上&线下活动,深入探索云世界
做任务,得社区积分和周边
最真实的开发者用云体验
让每位学生受益于普惠算力
让创作激发创新
资深技术专家手把手带教
遇见技术追梦人
技术交流,直击现场
海量开发者使用工具、手册,免费下载
极速、全面、稳定、安全的开源镜像
开发手册、白皮书、案例集等实战精华
为开发者定制的Chrome浏览器插件
今天又学习了一个装X概念——句柄,看字面意思,感觉跟某种器具有关,但实际上,这个词可不是用来打造家居用品的。
相信不少人跟我一样,第一眼看到这个词,脑海里只有一个大大的问号。不过,没关系,我们可以一起学习,毕竟,装X路上永远没有止境。
在计算机科学中,句柄(Handle)是一种引用或标识对象的方式,它可以用来访问或操作底层系统资源。
不同的操作系统可能会有不同的实现和用途,下面我将以不同的操作系统为例来解释句柄的意义。
在Windows中,句柄是一种整数值,用于标识和访问系统对象或资源,如窗口、文件、设备等。
句柄充当了对象的唯一标识符,通过句柄可以对对象进行操作和管理。
示例代码(C++):
HWNDhWnd=CreateWindow(L"Button",L"ClickMe",WS_VISIBLE|WS_CHILD,10,10,100,30,hWndParent,NULL,hInstance,NULL);if(hWnd!=NULL){//使用句柄操作窗口对象ShowWindow(hWnd,SW_SHOW);UpdateWindow(hWnd);//...}在上述代码中,通过CreateWindow函数创建一个按钮窗口,并将返回的句柄存储在hWnd变量中。然后,可以使用hWnd句柄来显示窗口、更新窗口等操作。
在Linux中,句柄通常称为文件描述符(FileDescriptor),它是一个非负整数,用于标识打开的文件、设备、管道等。
Linux将所有的I/O操作都抽象为文件,并使用文件描述符来引用和操作这些文件。
示例代码(C):
intfd=open("file.txt",O_RDONLY);if(fd!=-1){//使用文件描述符读取文件内容charbuffer[1024];ssize_tbytesRead=read(fd,buffer,sizeof(buffer));//...close(fd);}上述代码中,通过open函数打开文件file.txt,并将返回的文件描述符存储在fd变量中。然后,可以使用fd文件描述符来进行文件读取等操作。
在macOS中,句柄也称为文件描述符(FileDescriptor),类似于Linux操作系统的文件描述符。它是一个整数,用于标识和访问打开的文件、设备等。
示例代码(Objective-C):
intfileDescriptor=open("/path/to/file.txt",O_RDONLY);if(fileDescriptor!=-1){//使用文件描述符读取文件内容charbuffer[1024];ssize_tbytesRead=read(fileDescriptor,buffer,sizeof(buffer));//...close(fileDescriptor);}在上述代码中,通过open函数打开文件/path/to/file.txt,并将返回的文件描述符存储在fileDescriptor变量中。然后,可以使用fileDescriptor文件描述符来进行文件读取等操作。
总结起来,句柄(Handle)是一种在操作系统中用于标识、访问和操作系统资源的方式。
不同的操作系统有不同的实现和命名,如Windows中的句柄、Linux和macOS中的文件描述符。句柄提供了一种抽象层,使得程序可以使用标识符来引用和操作底层资源,从而实现对系统资源的管理和控制。
可以把句柄理解为一个中间媒介,通过这个中间媒介可控制、操作某样东西。
举个例子。doorhandle是指门把手,通过门把手可以去控制门,但doorhandle并非door本身,只是一个中间媒介。
又比如knifehandle是刀柄,通过刀柄可以使用刀。
跟doorhandle类似,我们可以用filehandle去操作file,但filehandle并非file本身。这个filehandle就被翻译成文件句柄,同理还有各种资源句柄。
句柄的引入主要是为了解决以下几个问题:
总之,句柄提供了一种统一、封装、安全和跨平台的解决方案,使得应用程序可以更方便地操作和管理底层系统资源。