成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

linuxfd指的是什么

本篇內容主要講解“l(fā)inux fd指的是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“l(fā)inux fd指的是什么”吧!

在裕華等地區(qū),都構建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產品創(chuàng)新能力,以專注、極致的服務理念,為客戶提供成都網(wǎng)站制作、做網(wǎng)站 網(wǎng)站設計制作按需策劃,公司網(wǎng)站建設,企業(yè)網(wǎng)站建設,品牌網(wǎng)站設計,全網(wǎng)營銷推廣,成都外貿網(wǎng)站建設公司,裕華網(wǎng)站建設費用合理。

在linux中,fd全稱“File descriptor”,中文名為“文件描述符”,它是內核為了高效管理這些已經(jīng)被打開的文件所創(chuàng)建的一種索引;它其實是一個非負整數(shù),用于指代被打開的文件,所有執(zhí)行I/O操作的系統(tǒng)調用都通過文件描述符來實現(xiàn)。

本教程操作環(huán)境:linux5.9.8系統(tǒng)、Dell G3電腦。

在linux中,fd全稱“File descriptor”,中文名為“文件描述符”。文件描述符是一個非負整數(shù),本質上是一個索引值(這句話非常重要)。

Linux中的文件描述符(fd)

我們知道在Linux系統(tǒng)中一切皆可以看成是文件,文件又可分為:普通文件、目錄文件、鏈接文件和設備文件。在操作這些所謂的文件的時候,我們每操作一次就找一次名字,這會耗費大量的時間和效率。所以Linux中規(guī)定每一個文件對應一個索引,這樣要操作文件的時候,我們直接找到索引就可以對其進行操作了。

文件描述符(file descriptor)就是內核為了高效管理這些已經(jīng)被打開的文件所創(chuàng)建的索引,其是一個非負整數(shù)(通常是小整數(shù)),用于指代被打開的文件,所有執(zhí)行I/O操作的系統(tǒng)調用都通過文件描述符來實現(xiàn)。同時還規(guī)定系統(tǒng)剛剛啟動的時候,0是標準輸入,1是標準輸出,2是標準錯誤。這意味著如果此時去打開一個新的文件,它的文件描述符會是3,再打開一個文件文件描述符就是4......

Linux內核對所有打開的文件有一個文件描述符表格,里面存儲了每個文件描述符作為索引與一個打開文件相對應的關系,簡單理解就是下圖這樣一個數(shù)組,文件描述符(索引)就是文件描述符表這個數(shù)組的下標,數(shù)組的內容就是指向一個個打開的文件的指針。linux fd指的是什么

上面只是簡單理解,實際上關于文件描述符,Linux內核維護了3個數(shù)據(jù)結構

  • 進程級的文件描述符表

  • 系統(tǒng)級的打開文件描述符表

  • 文件系統(tǒng)的i-node表

一個 Linux 進程啟動后,會在內核空間中創(chuàng)建一個 PCB 控制塊,PCB 內部有一個文件描述符表(File descriptor table),記錄著當前進程所有可用的文件描述符,也即當前進程所有打開的文件。進程級的描述符表的每一條記錄了單個進程所使用的文件描述符的相關信息,進程之間相互獨立,一個進程使用了文件描述符3,另一個進程也可以用3。除了進程級的文件描述符表,系統(tǒng)還需要維護另外兩張表:打開文件表、i-node 表。這兩張表存儲了每個打開文件的打開文件句柄(open file handle)。一個打開文件句柄存儲了與一個打開文件相關的全部信息。

系統(tǒng)級的打開文件描述符表:

  • 當前文件偏移量(調用read()和write()時更新,或使用lseek()直接修改)

  • 打開文件時的標識(open()的flags參數(shù))

  • 文件訪問模式(如調用open()時所設置的只讀模式、只寫模式或讀寫模式)

  • 與信號驅動相關的設置

  • 對該文件i-node對象的引用,即i-node 表指針

文件系統(tǒng)的i-node表:

  • 文件類型(例如:常規(guī)文件、套接字或FIFO)和訪問權限

  • 一個指針,指向該文件所持有的鎖列表

  • 文件的各種屬性,包括文件大小以及與不同類型操作相關的時間戳

文件描述符、打開的文件句柄以及i-node之間的關系如下圖:

linux fd指的是什么

  • 在進程 A 中,文件描述符 1 和 20 都指向了同一個打開文件表項,標號為 23(指向了打開文件表中下標為 23 的數(shù)組元素),這可能是通過調用 dup()、dup2()、fcntl() 或者對同一個文件多次調用了 open() 函數(shù)形成的。

  • 進程 A 的文件描述符 2 和進程 B 的文件描述符 2 都指向了同一個文件,這可能是在調用 fork() 后出現(xiàn)的(即進程 A、B 是父子進程關系),或者是不同的進程獨自去調用 open() 函數(shù)打開了同一個文件,此時進程內部的描述符正好分配到與其他進程打開該文件的描述符一樣。

  • 進程 A 的描述符 0 和進程 B 的描述符 3 分別指向不同的打開文件表項,但這些表項均指向 i-node 表的同一個條目(標號為 1976);換言之,它們指向了同一個文件。發(fā)生這種情況是因為每個進程各自對同一個文件發(fā)起了 open() 調用。同一個進程兩次打開同一個文件,也會發(fā)生類似情況。

這就說明:同一個進程的不同文件描述符可以指向同一個文件;不同進程可以擁有相同的文件描述符;不同進程的同一個文件描述符可以指向不同的文件(一般也是這樣,除了 0、1、2 這三個特殊的文件);不同進程的不同文件描述符也可以指向同一個文件。

Linux上打開文件舉例

比如在Linux上用 vim test.py打開一個文件,保持打開狀態(tài),再新打開一個新的shell,輸入命令pidof vim獲取vim進程的pid號,然后 ll  /proc/$pid/fd查看vim 進程所使用的文件描述符列表。

linux fd指的是什么

/dev/pts是遠程登陸(telnet,ssh等)后創(chuàng)建的控制臺設備文件所在的目錄。因為我是通過Xshell遠程登錄的,所以標準輸入0,標準輸出1,標準錯誤2的文件描述符都指向虛擬終端控制臺 /dev/pts/6 。再看下面是新打開的 test.py 的文件描述符,竟然是4,說好的從3開始呢?

這個我也困擾了好久,查了各種資料,終于在一個大佬的幫助下在一個論壇找到原因,有時候中文查不到還是要試試英文搜索啊。因為vim這種編輯器的原理是先打開源文件并拷貝,然后關閉源文件再打開自己的副本,修改完文件保存的時候直接將副本重命名覆蓋源文件。所以打開源文件的時候用的文件描述符3,然后打開自己的副本是時候就該用文件描述符4了,然后關閉源文件,文件描述符3就被釋放了,我們查看的時候就只剩下了4,這里它指向的是vim創(chuàng)建的副本文件。這里只是說個大概意思,具體深究要去深入了解一下 vim的實現(xiàn)原理——奧爾特星云大使,下面是當時我看到的論壇上的資料截圖,鏈接在這:StackOverFlow。

linux fd指的是什么

如果不相信可以試一試別的進程,比如 tail。

在Linux上用 tail -f test.py打開一個文件,保持打開狀態(tài),再新打開一個新的shell,輸入命令pidof tail獲取tail進程的pid號,然后 ll  /proc/$pid/fd查看tail進程所使用的文件描述符列表,可以看到文件描述符確實是從3開始使用的。tail不是編輯器不存在修改文件的情況,所以直接文件描述符直接打開的源文件。實際上可以使用 ll  /proc/$pid/fd命令獲取當前運行的任意進程的文件描述符使用情況。

linux fd指的是什么

擴展知識:Linux配置系統(tǒng)最大打開文件描述符個數(shù)

(1)系統(tǒng)級限制

理論上系統(tǒng)內存有多少就可以打開多少的文件描述符,但是在實際中內核是會做相應的處理,一般最大打開文件數(shù)會是系統(tǒng)內存的10%(以KB來計算),稱之為系統(tǒng)級限制。這個數(shù)字可以通過 cat /proc/sys/fs/file-max或者 sysctl -a | grep fs.file-max命令查看。

linux fd指的是什么

更改系統(tǒng)級限制有臨時更改和永久更改兩種方式:

  • 臨時更改:session斷開或者系統(tǒng)重啟后會恢復原來的設置值。使用命令 sysctl -w fs.file-max=xxxx,其中xxxx就是要設置的數(shù)字。

  • 永久更改:vim編輯 /etc/sysctl.conf文件,在后面添加 fs.file-max=xxxx,其中xxxx就是要設置的數(shù)字。保存退出后還要使用sysctl -p命令使其生效。

(2)用戶級限制

同時為了控制每個進程消耗的文件資源,內核也會對單個進程最大打開文件數(shù)做默認限制,即用戶級限制。32位系統(tǒng)默認值一般是1024,64位系統(tǒng)默認值一般是65535,可以使用 ulimit -n命令查看。

linux fd指的是什么

更改用戶級限制也有臨時更改和永久更改兩種方式:

  • 臨時更改:session斷開或者系統(tǒng)重啟后會恢復原來的設置值。使用命令 ulimit -SHn xxxx命令來修改,其中xxxx就是要設置的數(shù)字。

  • 永久更改:vim編輯 /etc/security/limits.conf文件,修改其中的 hard nofile xxxxsoft nofile xxxx,其中xxxx就是要設置的數(shù)字。保存后退出。

到此,相信大家對“l(fā)inux fd指的是什么”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續(xù)學習!

文章名稱:linuxfd指的是什么
標題來源:http://jinyejixie.com/article36/jjhepg.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供云服務器、小程序開發(fā)、全網(wǎng)營銷推廣、面包屑導航、網(wǎng)站建設網(wǎng)站設計公司

廣告

聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化
屏山县| 平顶山市| 年辖:市辖区| 曲阳县| 健康| 梧州市| 大洼县| 长葛市| 米林县| 马龙县| 雅江县| 石门县| 麻江县| 孝昌县| 吉安市| 南汇区| 西青区| 黎平县| 福州市| 邮箱| 荔波县| 兰考县| 南投县| 买车| 博罗县| 石嘴山市| 沾化县| 类乌齐县| 沭阳县| 京山县| 昭平县| 景洪市| 青冈县| 长沙县| 石渠县| 陆良县| 云龙县| 都江堰市| 海淀区| 天峻县| 南充市|