這篇文章給大家分享的是有關(guān)Linux下的文件類型有什么的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考。一起跟隨小編過來看看吧。
創(chuàng)新互聯(lián)于2013年創(chuàng)立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目成都網(wǎng)站設(shè)計、網(wǎng)站建設(shè)網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元沙市做網(wǎng)站,已為上家服務(wù),為沙市各地企業(yè)和個人服務(wù),聯(lián)系電話:18982081108
在Linux系統(tǒng)下,有七類文件類型:
普通文件(-)
目錄(d)
軟鏈接(字符鏈接L)
套接字文件(S)
字符設(shè)備(S)
塊設(shè)備(B)
管道文件(命名管道P)
普通文件、目錄、軟鏈接無需多解釋。下面帶大家了解一下管道文件、套接字文件、字符設(shè)備、塊設(shè)備類型。
管道分為匿名管道和命名管道。管道都是一端寫入、另一端讀取,它們是單方向數(shù)據(jù)傳輸?shù)?,它們的?shù)據(jù)都是直接在內(nèi)存中傳輸?shù)?,管道是進程間通信的一種方式,例如父進程寫,子進程讀。
在shell中匿名管道就是一個管道符號"|",例如ls | grep xxx
,其中l(wèi)s對應(yīng)的進程是這個獨立進程組中的父進程,grep對應(yīng)的進程是子進程,父進程寫子進程讀。
在編程語言中,匿名管道是通過創(chuàng)建兩個文件句柄或文件描述符(例如A、B)來實現(xiàn)的,一個文件句柄用于寫數(shù)據(jù)(例如A寫入端,數(shù)據(jù)寫入A將自動推入B中),另一個文件句柄用于讀數(shù)據(jù)(即B)。
對于命名管道,即有名稱的管道,命名管道將文件保留在文件系統(tǒng)中,它也稱為FIFO,也就是first in first out。雖然命名管道文件保留在文件系統(tǒng)中,但是這個文件只是使用命名管道的一個入口,在使用命名管道傳輸數(shù)據(jù)的時候,仍然是在內(nèi)存中進行的,也就是說并不會因為保留在文件系統(tǒng)上命名管道的效率就低了。
在shell中,可以使用mknod
命令或mkfifo
命令創(chuàng)建命名管道,在寫某些特殊需求的shell腳本時,命名管道非常有用。實際上,在Bash 4之后就支持協(xié)程(使用coproc命令)的功能了(ksh和zsh老早就支持協(xié)程),但是協(xié)程的需求都能通過命名管道來實現(xiàn)。
一般的管道都是單向通信的,無法實現(xiàn)雙向通信的功能,也就是只能一邊寫一邊讀,不能兩邊都能讀、寫。如果要實現(xiàn)雙向通信,可以創(chuàng)建兩根管道(這樣就有4個文件句柄,兩個讀端,兩個寫端),或者使用更方便的套接字。
套接字用來實現(xiàn)兩端通信,正如上面分析的,可以實現(xiàn)雙向管道的進程間通信功能。不僅如此,套接字還能通過網(wǎng)絡(luò)實現(xiàn)跨主機的進程間通信功能。
套接字需要成對才有意義,也就是分為兩端,每一端都有用于讀、寫的文件描述符(或文件句柄),相當(dāng)于兩根雙向通信的管道。
套接字根據(jù)協(xié)議族的方式分為兩大類:網(wǎng)絡(luò)套接字(AF_INET類型,根據(jù)ipv4和ipv6分為inet4和inet6)和Unix Domain套接字(AF_UNIX類型)。當(dāng)然,從協(xié)議族往下,套接字可細分為很多種類型,例如INET套接字可以分為TCP套接字、UDP套接字、鏈路層套接字、Raw套接字等等。其中網(wǎng)絡(luò)套接字是網(wǎng)絡(luò)編程的基礎(chǔ)和核心。
對于單機的進程間通信,使用Unix Domain套接字比Inet套接字更好,因為Unix Domain套接字沒有網(wǎng)絡(luò)通信組件,也就是少了很多網(wǎng)絡(luò)功能,它更加輕量級。實際上,某些語言在某些操作系統(tǒng)平臺上實現(xiàn)的管道功能就是通過Unix Domain來實現(xiàn)的,可想而知其高效率。
Unix Domain套接字有兩個文件句柄(例如A、B),這兩個文件句柄都是同時可讀、可寫的句柄。進程1向A寫入數(shù)據(jù),將自動推送到B上,進程2可從B上讀取從A寫入的數(shù)據(jù),同理進程2向B中寫入數(shù)據(jù)將自動推送到A上,進程1可從A上讀取從B寫入的數(shù)據(jù)。如下:
進程1 進程2 ------------------------ A -----------> B B -----------> A
在編程語言中,創(chuàng)建Unix Domain Socket自然有對應(yīng)的函數(shù)輕松創(chuàng)建(可man socketpair
)。對于bash shell,可以通過nc
命令(NetCat)來創(chuàng)建,或者干脆使用兩個命名管道來實現(xiàn)對應(yīng)的功能。如有需要,可自行了解如何在bash shell中使用Unix Domain套接字。
對于跨網(wǎng)絡(luò)的進程間通信,需要使用網(wǎng)絡(luò)套接字。每個網(wǎng)絡(luò)套接字都由5部分組成,它們稱為套接字的5元組。格式如下:
{protocol, src_addr, src_port, dest_addr, dest_port}
即協(xié)議、源地址、源端口、目標(biāo)地址、目標(biāo)端口。
每端套接字在內(nèi)核空間都有兩個buffer(即一對socket有4個buffer),每一端都有recv buffer和send buffer。進程1向自己的套接字的send buffer寫入數(shù)據(jù),將發(fā)送到對端的recv buffer中,然后對端的進程2就可以從recv buffer中讀取數(shù)據(jù),反之亦然。
但是在真正可以讀、寫網(wǎng)絡(luò)套接字之前,網(wǎng)路套接字還需要一些設(shè)置。服務(wù)端套接字創(chuàng)建(socket()函數(shù),創(chuàng)建后就會有一個文件句柄或文件描述符供讀、寫操作)后,還要綁定地址(通過bind()函數(shù))和監(jiān)聽端口(通過listen()函數(shù)),客戶端則只需要創(chuàng)建套接字后,直接使用connect()函數(shù)向服務(wù)端套接字發(fā)起連接請求即可。
對于TCP套接字,客戶端發(fā)起連接請求即表示要和服務(wù)端進行三次握手(內(nèi)核完成,和用戶空間進程無關(guān))。將這三次握手的每一次進行細分,第一次客戶端發(fā)送SYN請求,服務(wù)端接收到SYN后,內(nèi)核將這個連接放進syn queue中并設(shè)置狀態(tài)為syn-recv,然后發(fā)送ack+syn給客戶端,當(dāng)接收到客戶端回復(fù)ack后,內(nèi)核將連接從syn queue移到established queue(或accept queue)中并將連接的狀態(tài)標(biāo)記為established。最后等待用戶空間的進程發(fā)起accept()系統(tǒng)調(diào)用讓內(nèi)核將其從accept queue中移除。被accept()后的連接表示已經(jīng)建立好的連接,可以真正實現(xiàn)兩端進程間的數(shù)據(jù)傳輸。
更多關(guān)于TCP套接字的原理,參見我的另一篇文章:不可不知的socket和TCP連接過程。
塊設(shè)備是硬件設(shè)備,通過隨機(不一定是順序)訪問固定大小的數(shù)據(jù)塊(chunk)來區(qū)分。固定大小的chunk稱為塊(block)。最常見的塊設(shè)備是硬盤,但也存在許多其他塊設(shè)備,如軟盤驅(qū)動器、藍光閱讀器和閃存。注意,這些都是掛載文件系統(tǒng)的設(shè)備,文件系統(tǒng)就像是塊設(shè)備的通用語言。
字符設(shè)備通過連續(xù)的流數(shù)據(jù)訪問,一個字節(jié)接著一個字節(jié)。典型的字符設(shè)備是終端(終端分多種,由物理的也有虛擬的)和鍵盤。
區(qū)分塊設(shè)備和字符設(shè)備最簡單的方法是看數(shù)據(jù)訪問的方式。能隨機訪問獲取數(shù)據(jù)的是塊設(shè)備,必須按字節(jié)順序訪問的是字符設(shè)備。
如果可以這里讀一點數(shù)據(jù),那里讀一點數(shù)據(jù),最后串成一整段連續(xù)的數(shù)據(jù),那么這個就是塊設(shè)備,就像硬盤上的數(shù)據(jù)是不連續(xù)的,有可能需要通過隨機訪問的方式獲取一段數(shù)據(jù)。比如磁盤上一個稍大一點的文件,可能前10k數(shù)據(jù)是連續(xù)的數(shù)據(jù)塊或在連續(xù)的扇區(qū)內(nèi),之后的10k數(shù)據(jù)在離它很遠甚至在不同的柱面上。
如果一段數(shù)據(jù)中的每個字節(jié)都跟訪問時的字節(jié)順序是一樣的,即字節(jié)先后順序從訪問獲取時到最后處理數(shù)據(jù)的過程中都是完全一致的,那么這個就是字符設(shè)備。換句話說,字符設(shè)備可以看作是流設(shè)備。就像鍵盤輸入數(shù)據(jù)一樣,連續(xù)敲兩個字鍵,這兩個鍵對應(yīng)的字節(jié)數(shù)據(jù)在被接收的時候一定是先敲的在前面,后敲的在后面。同理終端設(shè)備也是以一樣的,程序?qū)?shù)據(jù)輸出到終端時,程序先輸出字母a再輸出數(shù)字3,那么顯示在終端上時一定是a在前,3在后。
感謝各位的閱讀!關(guān)于Linux下的文件類型有什么就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!