石建 | Fat Mind

          [轉] Linux 句柄是什么 ?


          1.句柄就是一個標識符,只要獲得對象的句柄,我們就可以對對象進行任意的操作。

          2.句柄不是指針,操作系統用句柄可以找到一塊內存,這個句柄可能是標識符,mapkey,也可能是指針,看操作系統怎么處理的了。

          fd算是在某種程度上替代句柄吧;

          Linux 有相應機制,但沒有統一的句柄類型,各種類型的系統資源由各自的類型來標識,由各自的接口操作。

          3.http://tech.ddvip.com/2009-06/1244006580122204_11.html

          在操作系統層面上,文件操作也有類似于FILE的一個概念,在Linux里,這叫做文件描述符(File Descriptor),而在Windows里,叫做句柄(Handle)(以下在沒有歧義的時候統稱為句柄)。用戶通過某個函數打開文件以獲得句柄,此 后用戶操縱文件皆通過該句柄進行。

           

          設計這么一個句柄的原因在于句柄可以防止用戶隨意讀寫操作系統內核的文件對象。無論是Linux還是Windows,文件句柄總是和內核的文件對象相關聯的,但如何關聯細節用戶并不可見。內核可以通過句柄來計算出內核里文件對象的地址,但此能力并不對用戶開放。

           

          下面舉一個實際的例子,在Linux中,值為0、12fd分別代表標準輸入、標準輸出和標準錯誤輸出。在程序中打開文件得到的fd3開始增長。 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 類型的句柄來標識。

          如今,內存 容量的增大和虛擬內存 算法使得更簡單的指針 愈加受到青睞,而指向另一指針的那類句柄受到冷淡。盡管如此,許多操作系統 仍然把指向私有對象 的指針以及進程傳遞給客戶端 的內部數組 下標稱為句柄。


           

          posted on 2012-04-06 14:02 石建 | Fat Mind 閱讀(11902) 評論(0)  編輯  收藏 所屬分類: 資料收集


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           

          導航

          <2012年4月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          統計

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          搜索

          最新評論

          What 、How、Why,從細節中尋找不斷的成長點
          主站蜘蛛池模板: 吉木乃县| 荔浦县| 德兴市| 栾川县| 宜阳县| 明水县| 巴楚县| 安丘市| 民权县| 锦屏县| 泰和县| 天峨县| 庆城县| 湟源县| 肃北| 论坛| 庄浪县| 东方市| 南昌市| 清流县| 正定县| 巴塘县| 鄂托克旗| 临朐县| 天气| 偃师市| 澳门| 莆田市| 响水县| 永年县| 南充市| 根河市| 治县。| 高雄市| 榆树市| 舞钢市| 洪湖市| 名山县| 吴忠市| 榆中县| 罗甸县|