计算机中的“句柄”到底是啥意思呢
所谓句柄,实际上是⼀个数据,是⼀个 long (长整型)的数据。句柄是windows⽤来标识被应⽤程序所建⽴或使⽤的对象的唯⼀整数。但是⼈家想了解的是,linux 中的句柄⼜是啥意思呢?
记住我
1. 句柄就是⼀个标识符,只要获得对象的句柄,我们就可以对对象进⾏任意的操作。
2. 句柄不是指针,操作系统⽤句柄可以到⼀块内存,这个句柄可能是标识符,map的key, 也可能是指针,看操作系统怎么处理的了。fd算是在某种程度上替代句柄吧;linux 有相应机制,但没有统⼀的句柄类型,各种类型的系统资源由各⾃的类型来标识,由各⾃的接⼝操作。粗暴的解释:
最早的windows开发书籍,handle 是被翻译成 “把⼿” 的。虽然不好听,但是个⼈认为⾮常传神。
虽然你握住的只是把⼿,却能拉动整扇门,⽽且你根本不⽤在意那门长什么样⼦
⼀扇门如果有多个把⼿,被不同的⼈(进程)握住,门往哪⼉⾛就不好说了
设计这么⼀个句柄的原因在于句柄可以防⽌⽤户随意读写操作系统内核的⽂件对象。⽆论是linux 还是windows, ⽂件句柄总是和内核的⽂件对象相关联的,但如何关联细节⽤户并不可见。内核可以通过句柄计算出内核⽂件对象的地址,但此能⼒并不对⽤户开放。
在linux中的句柄
在linux系统设计⾥⾯遵循⼀切都是⽂件的原则,即磁盘⽂件、⽬录、⽹络套接字、管道等,所有这些都是⽂件,在我们进⾏打开的时候会返回⼀个fd, 即是⽂件句柄。如果频繁的打开⽂件,或者打开⽹络套接字⽽忘记释放就会有句柄泄漏的现象。在linux系统中对进程可以调⽤的⽂件句柄数进⾏了限制,在默认情况下每个进程可以调⽤的最⼤句柄数是1024个,如果超出了这个限制,进程将⽆法获得新的句柄,从⽽导致不能打开新的⽂件或者⽹络套接字,对于线上服务器即会出现服务被拒绝的情况。
下⾯举⼀个实际的例⼦,在linux中,值为0,1,2的fd分别代表标准输⼊、标准输出和标准错误输出。在程序中打开⽂件得到的fd从3开始增长。fd具体是什么呢?在内核中,每⼀个进程都有⼀个私有的“打开⽂件表”,这个表是⼀个指针数组,每⼀个元素都指向⼀个内核的打开⽂件对象。⽽fd,就是这个表的下标。当⽤户打开⼀个⽂件时,内核会在内部⽣成⼀个打开⽂件对象,并在这个表⾥到⼀个空项,让这⼀项指向⽣成的打开⽂件对象,并返回这⼀项的下标作为fd。由于这个表处于内核,并且⽤户⽆法访问到,因此⽤户即使拥有fd,也⽆法得到打开⽂件对象的地址,只能够通过系统提供的函数来操作。
在程序设计中,句柄是⼀种特殊的智能指针。当⼀个应⽤程序要应⽤其他系统(如数据库、操作系统)所管理的内存块或对象时,就要使⽤句柄。
句柄与普通指针的区别在于,指针包含的是引⽤对象的内存地址,⽽句柄则是由系统所管理的引⽤标识,该标识可以被系统重新定位到⼀个内存地址上。这种间接访问对象的模式增强了系统对引⽤对象的控制。