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