引用連接:https://blog.csdn.net/qq769651718/article/details/79459346node
文件描述符的做用:linux
文件描述符是linux操做系統中特有的概念。其至關於windows系統中的句柄。習慣性的,咱們也把linux文件描述符稱之句柄。不管是文件句柄(Windows中概念),仍是文件描述符(linux中概念),其最終目的都是用來定位打開的文件在內存中的位置,只是它們映射的方式不同。內核(kernel)利用文件描述符(file descriptor)來訪問文件。1個Linux進程啓動後,會在內核空間建立一個PCB進程控制塊,PCB是一個進程的私有財產。這個PCB中有一個已打開文件描述符表,記錄着全部該進程打開的文件描述符以及對應的file結構體地址。默認狀況下,啓動一個Linux進程後,會打開三個文件,分別是標準輸入、標準輸出、標準錯誤分別使用了0、1 、2號文件描述符。當該進程使用函數open打開一個新的文件時,通常會在內核空間申請一個file結構體,而且把3號文件描述符對應的file指針指向file結構體。 |
文件描述符是一個簡單的整數,用以標明每個被進程所打開的文件和socket。第一個打開的文件是0,第二個是1,依此類推。Unix操做系統一般給每一個進程能打開的文件數量強加一個限制。vim
每一個文件描述符都指向一個打開的文件。 不一樣的文件描述符可能指向同一個打開的文件。windows 相同的文件可能被不一樣的進程打開,也能夠在被同一個進程打開屢次。安全 標準輸入文件(stdin): stdin的文件描述符爲0,linux程序默認從stdin讀取數據。socket 標準輸出文件(stdout): stdout 的文件描述爲1,linux程序默認想stdout輸出數據。函數 標準錯誤文件(stderr): stderr 的文件描述符爲2,linux程序會向stderr流中寫入錯誤信息。spa |
雖說系統內存有多少就能夠打開多少的文件描述符,可是在實際實現過程當中內核是會作相應的處理的,通常最大打開文件數會是系統內存的10%(以KB來計算)(稱之爲系統級限制)。操作系統
查看系統級別的最大打開文件數:sysctl -a | grep fs.file-max.net
[root@lbg ~]# sysctl -a | grep fs.file-max fs.file-max = 96325 |
同時,內核爲了避免讓某一個進程消耗掉全部的文件資源,其也會對單個進程最大打開文件數作默認值處理(稱之爲用戶級限制),默認值通常是1024,使用ulimit -n命令能夠查看。
查看單進程最大打開文件數: ulimit -n
[root@lbg ~]# ulimit -n 1024 臨時增大用戶級限制的值: [root@lbg ~]# ulimit -HSn 60000 ----修改成60000,只在當前回話生效。 永久增大用戶級限制的值: [root@lbg ~]# vim /etc/security/limits.conf |
元數據與用戶數據:
文件都有文件名與數據,在 Linux 上被分紅兩個部分:用戶數據 (user data) 與元數據 (metadata)。 用戶數據,即文件數據塊 (data block),數據塊是記錄文件真實內容的地方; 元數據則是文件的附加屬性,如文件大小、建立時間、全部者等信息。 在 Linux 中,元數據中的 inode 號(inode 是文件元數據的一部分但其並不包含文件名,inode 號即索引節點號)纔是文件的惟一標識而非文件名。文件名僅是爲了方便人們的記憶和使用,系統或程序經過 inode 號尋找正確的文件數據塊。 |
查看 inode 號可以使用命令 stat 或 ls -i(如果 AIX 系統,則使用命令 istat)
[root@localhost test]# ls cron p [root@localhost test]# ls -i 17808923 cron 17808924 p [root@localhost test]# stat /test File: ?.test? Size: 40 Blocks: 0 IO Block: 4096 directory Device: 803h/2051d Inode: 17808920 Links: 2 Access: (0777/drwxrwxrwx) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2018-10-03 15:46:15.308776277 +0800 Modify: 2018-10-03 15:46:14.289776178 +0800 Change: 2018-10-03 15:46:14.289776178 +0800 |
硬連接 (hard link) 與軟連接(又稱符號連接,即 soft link 或 symbolic link):
連接爲 Linux 系統解決了文件的共享使用,還帶來了隱藏文件路徑、增長權限安全及節省存儲等好處。若一個inode 號對應多個文件名,則稱這些文件爲硬連接。換言之,硬連接就是同一個文件使用了多個別名。 |
硬連接可由命令 link 或 ln 建立:
[root@localhost test]# ls cron p [root@localhost test]# ln p a [root@localhost test]# ls -i 17808924 a 17808923 cron 17808924 p |
硬連接存在如下幾點特性:
|
硬連接說明:
文件a 與 p 有着相同的 inode 號:17808924及文件權限,inode 是隨着文件的存在而存在,所以只有當文件存在時纔可建立硬連接,即當 inode 存在且連接計數器(link count)不爲 0 時。inode 號僅在各文件系統下是惟一的,當 Linux 掛載多個文件系統後將出現 inode 號重複的現象,所以硬連接建立時不可跨文件系統。 硬連接不能對目錄建立是受限於文件系統的設計。 Linux 文件系統中的目錄均隱藏了兩個個特殊的目錄:當前目錄(.)與父目錄(..)。查看這兩個特殊目錄的 inode 號可知其實這兩目錄就是兩個硬連接 |
例子:
[root@localhost test]# ls -i 17808924 a 17808922 b 17808923 cron 17808924 p [root@localhost b]# ls -d -i /test/b 17808922 /test/b |
軟連接:
軟連接與硬連接不一樣,若文件用戶數據塊中存放的內容是另外一文件的路徑名的指向,則該文件就是軟鏈接。軟連接就是一個普通文件,只是數據塊內容有點特殊。軟連接有着本身的 inode 號以及用戶數據塊,所以軟連接的建立與使用沒有相似硬連接的諸多限制。 |
建立軟連接的示例:
[root@localhost test]# ls -i [root@localhost test]# ln -s a a.soft 17808924 a 17808927 a.soft 17808922 b 17808923 cron 17808924 p |
軟鏈接特性:
|
使用絕對路徑建立軟鏈接:
軟連接建立時原文件的路徑指向使用絕對路徑較好。使用相對路徑建立的軟連接被移動後該軟連接文件將成爲一個死連接。 |
死連接:
死連接:刪除軟連接並不影響被指向的文件,但若被指向的原文件被刪除,則相關軟鏈接被稱爲死連接(即dangling link,若被指向路徑文件被從新建立,死連接可恢復爲正常的軟連接)。 |
輸入輸出重定向:
n > file 將文件描述符爲 n 的文件重定向到 file。 n >> file 將文件描述符爲 n 的文件以追加的方式重定向到 file。 n >& m 將輸出文件 m 和 n 合併 n <& m 將輸入文件 m 和 n 合併。 << EOF 將開始標記 EOF 和結束標記 EOF之間的內容做爲輸入。(EOF:end of file,也可用任意其餘字符) |
輸出重定向:(會清除裏面內容,再重定向)
1> 標準輸出重定向 2> 錯誤輸出重定向 &> 所有輸出重定向 其中 1> 標準輸出,可簡寫 >. |
三種重定向的特色都是:
若文件不存在,會建立空文件並將命令的輸出結果重定向到該文件中 若文件存在,則會先清空文件再重定向 ls a >a 假設是標準輸出,則會清空a原有的內容,寫進輸出結果a, ll a >a 假設是標準輸出,則會清空a原有的內容,寫進輸出結果 ls a >c &>f假設命令是標準輸出,則會寫進f文件裏,而不寫進c文件裏,而且會將c內容清空. ls a >c 2>f 假設是標準輸出,則會覆蓋c,而且清空f. ll a >c 2>&1 假設是標準輸出,則c裏內容會被覆蓋. |
追加劇定向:不先清除裏面內容,不覆蓋裏面內容,直接在內容後面接着寫.
1>> 標準輸出追加劇定向 2>> 錯誤輸出追加劇定向 &>> 所有輸出追加劇定向 其中1>> 標準輸出,可簡寫 >> |
註明:
ls dsaiog fsdsa &>/dev/null --將不須要的結果放入黑洞中。 |
輸入重定向:
[root@lbg ~]# cat < /etc/passwd ---這種寫法等效於: cat /etc/passwd |
<<的兩種用法:
方法1: [root@lbg ~]# cat << EOF > /tmp/test ---cat兩EOF之間的內容,再輸入重定向到/tmp/test中。 > test1 > test2 > EOF [root@lbg ~]# cat /tmp/test test1
test2 [root@lbg ~]# cat /tmp/test2 cat: /tmp/test2: No such file or directory [root@lbg ~]# cat > /tmp/test2 << lbg --將lbg之間的內容輸入到/tmp/test2中 > a > b > lbg [root@lbg ~]# cat /tmp/test2 a b |
<<的使用方法2:
[root@lbg ~]# cat /tmp/test1 pwd ls [root@lbg ~]# /tmp/test1<<lbg ----這種對文件yy要有x權限.
> lbg /root ----執行命令pwd的結果 anaconda-ks.cfg initial-setup-ks.cfg ----執行命令ls的結果 |
< 將1個文件內容輸入到另外一個文件:
[root@lbg ~]# cat < /tmp/test >/tmp/test1 ---將/tmp/test內容輸入重定向到/tmp/test1中。 [root@lbg ~]# cat /tmp/test test1 test2 [root@lbg ~]# cat /tmp/test1 test1 test2 |