源地址:http://www.blogjava.net/shijian/archive/2012/04/06/373463.html
1.句柄就是一個標識符,只要獲得對象的句柄,我們就可以對對象進行任意的操作。
2.句柄不是指針,操作系統用句柄可以找到一塊內存,這個句柄可能是標識符,map的key,也可能是指針,看操作系統怎么處理的了。
fd算是在某種程度上替代句柄吧;
Linux 有相應機制,但沒有統一的句柄類型,各種類型的系統資源由各自的類型來標識,由各自的接口操作。
3.http://tech.ddvip.com/2009-06/1244006580122204_11.html
在操作系統層面上,文件操作也有類似於FILE的一個概念,在Linux里,這叫做文件描述符(File Descriptor),而在Windows里,叫做句柄(Handle)(以下在沒有歧義的時候統稱為句柄)。用戶通過某個函數打開文件以獲得句柄,此 后用戶操縱文件皆通過該句柄進行。
設計這么一個句柄的原因在於句柄可以防止用戶隨意讀寫操作系統內核的文件對象。無論是Linux還是Windows,文件句柄總是和內核的文件對象相關聯的,但如何關聯細節用戶並不可見。內核可以通過句柄來計算出內核里文件對象的地址,但此能力並不對用戶開放。
下面舉一個實際的例子,在Linux中,值為0、1、2的fd分別代表標准輸入、標准輸出和標准錯誤輸出。在程序中打開文件得到的fd從3開始增長。 fd具體是什么呢?在內核中,每一個進程都有一個私有的“打開文件表”,這個表是一個指針數組,每一個元素都指向一個內核的打開文件對象。而fd,就是這 個表的下標。當用戶打開一個文件時,內核會在內部生成一個打開文件對象,並在這個表里找到一個空項,讓這一項指向生成的打開文件對象,並返回這一項的下標 作為fd。由於這個表處於內核,並且用戶無法訪問到,因此用戶即使擁有fd,也無法得到打開文件對象的地址,只能夠通過系統提供的函數來操作。
在C語言里,操縱文件的渠道則是FILE結構,不難想象,C語言中的FILE結構必定和fd有一對一的關系,每個FILE結構都會記錄自己唯一對應的fd。
句柄 http://zh.wikipedia.org/wiki/%E5%8F%A5%E6%9F%84
在程序設計 中,句柄是一種特殊的智能指針 。當一個應用程序 要引用其他系統(如數據庫、操作系統 )所管理的內存 塊或對象 時,就要使用句柄。
句柄與普通指針 的區別在於,指針包含的是引用對象 的內存地址 ,而句柄則是由系統所管理的引用標識,該標識可以被系統重新定位到一個內存地址 上。這種間接訪問對象 的模式增強了系統對引用對象 的控制。(參見封裝 )。
在上世紀80年代的操作系統(如Mac OS 和Windows )的內存管理 中,句柄被廣泛應用。Unix 系統的文件描述符 基本上也屬於句柄。和其它桌面環境 一樣,Windows API 大量使用句柄來標識系統中的對象 ,並建立操作系統與用戶空間 之間的通信渠道。例如,桌面上的一個窗體由一個HWND 類型的句柄來標識。
如今,內存 容量的增大和虛擬內存 算法使得更簡單的指針 愈加受到青睞,而指向另一指針的那類句柄受到冷淡。盡管如此,許多操作系統 仍然把指向私有對象 的指針以及進程傳遞給客戶端 的內部數組 下標稱為句柄。