首頁 > 運維 > linux運維 > 主體

linux句柄是什麼

青灯夜游
發布: 2022-02-25 13:39:45
原創
5907 人瀏覽過

在linux中,句柄是一個標識符,是由系統所管理的引用標識,核心可以透過句柄來計算出核心裡文件物件的位址;開發者只要取得物件的句柄,就可以對物件進行任意的操作。

linux句柄是什麼

本教學操作環境:linux5.9.8系統、Dell G3電腦。

什麼是句柄

句柄就是一個標識符,只要得到物件的句柄,我們就可以對物件進行任意的操作。

句柄不是指針,作業系統用句柄可以找到一塊內存,這個句柄可能是標識符,map的key,也可能是指針,看操作系統怎麼處理的了。 fd算是在某種程度上替代句柄吧;Linux 有對應機制,但沒有統一的句柄類型,各種類型的系統資源由各自的類型來標識,由各自的介面操作。

在作業系統層面上,檔案操作也有類似FILE的一個概念,在Linux裡,這叫做檔案描述子(File Descriptor),而在Windows裡,叫做句柄(Handle)(以下在沒有歧義的時候統稱為句柄)。使用者透過某個函數開啟檔案以取得句柄,此後使用者操縱檔案皆透過該句柄進行。

粗暴的解釋

windowns中是handle,liunx類似的是fd,最早的windows開發書籍,handle是被翻譯成「把手”的。雖然不好聽,但是個人認為相當傳神。

雖然你握住的只是把手,卻能拉動整扇門,而且你根本不用在意那門長什麼樣子

一扇門如果有多個把手,被不同的人(進程)握住,門往哪裡走就不好說了

設計這麼一個句柄的原因在於句柄可以防止用戶隨意讀寫操作系統內核的文件對象。無論是Linux還是Windows,檔案句柄總是和核心的檔案物件相關聯的,但如何關聯細節使用者並不可見。核心可以透過句柄來計算出核心裡文件物件的位址,但此能力並不對使用者開放。

在liunx中的句柄

#在linux系統設計裡面遵循一切都是檔案的原則,即磁碟檔案、目錄、網路套接字、磁碟、管道等,所有這些都是文件,在我們進行開啟的時候會回傳一個fd,也就是文件句柄。

如果頻繁的開啟文件,或開啟網路套接字而忘記釋放就會有句柄洩漏的現象。

在linux系統中對進程可以呼叫的檔案句柄數進行了限制,在預設情況下每個進程可以呼叫的最大句柄數是1024個,如果超過了這個限制,進程將無法取得新的句柄,而從導致不能開啟新的檔案或網路套接字,對於線上伺服器即會出現服務被拒絕的情況。

下面舉一個實際的例子,在Linux中,值為0、1、2的fd分別代表標準輸入、標準輸出、標準錯誤輸出。在程式中開啟檔案得到的fd從3開始成長。

fd具體是什麼呢?

在內核中,每一個進程都有一個私有的“打開文件表”,這個表是一個指針數組,每一個元素都指向一個內核的開啟文件對象。

而fd,就是這個表的下標。當使用者開啟一個檔案時,核心會在內部產生一個開啟檔案對象,並在這個表格裡找到一個空項,讓這一項指向產生的開啟檔案對象,並傳回這項的下標作為fd。

由於這個表處於內核,且使用者無法存取到,因此使用者即使擁有fd,也無法得到開啟檔案物件的位址,只能夠透過系統提供的函數來操作。

在C語言裡,操縱檔案的管道則是FILE結構,不難想像,C語言中的FILE結構必定和fd有一對一的關係,每個FILE結構都會記錄自己唯一對應的fd 。

在程式設計中,句柄是一種特殊的智慧指標。當一個應用程式要引用其他系統(如資料庫、作業系統 )所管理的記憶體 區塊或物件 時,就要使用句柄。

句柄與普通指標的差異在於,指標包含的是引用物件的記憶體位址,而句柄則是由系統所管理的參考標識,該標識可以被系統重新定位到一個記憶體位址上。這種間接存取物件的模式增強了系統對引用物件 的控制。

在上世紀80年代的作業系統(如Mac OS 和Windows )的記憶體管理 中,句柄被廣泛地應用。 Unix 系統的檔案描述子 基本上也屬於句柄。和其它桌面環境 一樣,Windows API 大量使用句柄來識別系統中的物件 ,並建立作業系統與使用者空間 之間的通訊管道。例如,桌面上的一個視窗由一個HWND 類型的句柄來識別。

如今,記憶體容量的增大和虛擬記憶體演算法使得更簡單的指標愈加受到青睞,而指向另一指標的那類句柄受到冷淡。儘管如此,許多作業系統仍然把指向私有物件的指標以及進程傳遞給客戶端的內部陣列下標稱為句柄。

相關推薦:《Linux影片教學

以上是linux句柄是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!