久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長(zhǎng)資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      linux fd是什么

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

      linux fd是什么

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

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

      Linux中的文件描述符(fd)

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

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

      Linux內(nèi)核對(duì)所有打開(kāi)的文件有一個(gè)文件描述符表格,里面存儲(chǔ)了每個(gè)文件描述符作為索引與一個(gè)打開(kāi)文件相對(duì)應(yīng)的關(guān)系,簡(jiǎn)單理解就是下圖這樣一個(gè)數(shù)組,文件描述符(索引)就是文件描述符表這個(gè)數(shù)組的下標(biāo),數(shù)組的內(nèi)容就是指向一個(gè)個(gè)打開(kāi)的文件的指針。linux fd是什么

      上面只是簡(jiǎn)單理解,實(shí)際上關(guān)于文件描述符,Linux內(nèi)核維護(hù)了3個(gè)數(shù)據(jù)結(jié)構(gòu)

      • 進(jìn)程級(jí)的文件描述符表
      • 系統(tǒng)級(jí)的打開(kāi)文件描述符表
      • 文件系統(tǒng)的i-node表

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

      系統(tǒng)級(jí)的打開(kāi)文件描述符表:

      • 當(dāng)前文件偏移量(調(diào)用read()和write()時(shí)更新,或使用lseek()直接修改)
      • 打開(kāi)文件時(shí)的標(biāo)識(shí)(open()的flags參數(shù))
      • 文件訪問(wèn)模式(如調(diào)用open()時(shí)所設(shè)置的只讀模式、只寫(xiě)模式或讀寫(xiě)模式)
      • 與信號(hào)驅(qū)動(dòng)相關(guān)的設(shè)置
      • 對(duì)該文件i-node對(duì)象的引用,即i-node 表指針

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

      • 文件類(lèi)型(例如:常規(guī)文件、套接字或FIFO)和訪問(wèn)權(quán)限
      • 一個(gè)指針,指向該文件所持有的鎖列表
      • 文件的各種屬性,包括文件大小以及與不同類(lèi)型操作相關(guān)的時(shí)間戳

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

      linux fd是什么

      • 在進(jìn)程 A 中,文件描述符 1 和 20 都指向了同一個(gè)打開(kāi)文件表項(xiàng),標(biāo)號(hào)為 23(指向了打開(kāi)文件表中下標(biāo)為 23 的數(shù)組元素),這可能是通過(guò)調(diào)用 dup()、dup2()、fcntl() 或者對(duì)同一個(gè)文件多次調(diào)用了 open() 函數(shù)形成的。
      • 進(jìn)程 A 的文件描述符 2 和進(jìn)程 B 的文件描述符 2 都指向了同一個(gè)文件,這可能是在調(diào)用 fork() 后出現(xiàn)的(即進(jìn)程 A、B 是父子進(jìn)程關(guān)系),或者是不同的進(jìn)程獨(dú)自去調(diào)用 open() 函數(shù)打開(kāi)了同一個(gè)文件,此時(shí)進(jìn)程內(nèi)部的描述符正好分配到與其他進(jìn)程打開(kāi)該文件的描述符一樣。
      • 進(jìn)程 A 的描述符 0 和進(jìn)程 B 的描述符 3 分別指向不同的打開(kāi)文件表項(xiàng),但這些表項(xiàng)均指向 i-node 表的同一個(gè)條目(標(biāo)號(hào)為 1976);換言之,它們指向了同一個(gè)文件。發(fā)生這種情況是因?yàn)槊總€(gè)進(jìn)程各自對(duì)同一個(gè)文件發(fā)起了 open() 調(diào)用。同一個(gè)進(jìn)程兩次打開(kāi)同一個(gè)文件,也會(huì)發(fā)生類(lèi)似情況。

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

      Linux上打開(kāi)文件舉例

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

      linux fd是什么

      /dev/pts是遠(yuǎn)程登陸(telnet,ssh等)后創(chuàng)建的控制臺(tái)設(shè)備文件所在的目錄。因?yàn)槲沂峭ㄟ^(guò)Xshell遠(yuǎn)程登錄的,所以標(biāo)準(zhǔn)輸入0,標(biāo)準(zhǔn)輸出1,標(biāo)準(zhǔn)錯(cuò)誤2的文件描述符都指向虛擬終端控制臺(tái) /dev/pts/6 。再看下面是新打開(kāi)的 test.py 的文件描述符,竟然是4,說(shuō)好的從3開(kāi)始呢?

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

      linux fd是什么

      如果不相信可以試一試別的進(jìn)程,比如 tail。

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

      linux fd是什么

      擴(kuò)展知識(shí):Linux配置系統(tǒng)最大打開(kāi)文件描述符個(gè)數(shù)

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

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

      linux fd是什么

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

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

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

      (2)用戶(hù)級(jí)限制

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

      linux fd是什么

      更改用戶(hù)級(jí)限制也有臨時(shí)更改和永久更改兩種方式:

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

      • 永久更改:vim編輯 /etc/security/limits.conf 文件,修改其中的 hard nofile xxxxsoft nofile xxxx,其中xxxx就是要設(shè)置的數(shù)字。保存后退出。關(guān)于hard和soft的區(qū)別,參照下面參考鏈接中的第5個(gè)。

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)