共計 1852 個字符,預計需要花費 5 分鐘才能閱讀完成。
本篇內容主要講解“linux 句柄的概念是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓丸趣 TV 小編來帶大家學習“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 句柄的概念是什么”有了更深的了解,不妨來實際操作一番吧!這里是丸趣 TV 網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!