Linux很重要的設(shè)計思想就是一切皆文件,網(wǎng)絡(luò)是文件,鍵盤等外設(shè)也是文件,很神奇吧?于是所有資源都有了統(tǒng)一的接口,開發(fā)者可以像寫文件那樣通過網(wǎng)絡(luò)傳輸數(shù)據(jù),我們也可以通過/proc/的文件看到進程的資源使用情況。
內(nèi)核給每個訪問的文件分配了文件描述符(File Descriptor),它本質(zhì)是一個非負整數(shù),在打開或新建文件時返回,以后讀寫文件都要通過這個文件描述符了。
我們想想操作系統(tǒng)打開的文件這么多,不可能他們共用一套文件描述符整數(shù)吧?這樣想就對了,Linux實現(xiàn)時這個fd其實是一個索引值,指向每個進程打開文件的記錄表。
POSIX已經(jīng)定義了STDIN_FILENO、STDOUT_FILENO和STDERR_FILENO三個常量,也就是0、1、2。這三個文件描述符是每個進程都有的,這也解釋了為什么每個進程都有編號為0、1、2的文件而不會與其他進程沖突。
文件描述符幫助應(yīng)用找到這個文件,而文件的打開模式等上下文信息存儲在文件對象中,這個對象直接與文件描述符關(guān)聯(lián)。
注意了,每個系統(tǒng)對文件描述符個數(shù)都有限制。我們網(wǎng)上看到配置ulimit也是為了調(diào)整系統(tǒng)的打開文件個數(shù),因為一般服務(wù)器都要同時處理成千上萬個起請求,記住socket連接也是文件哦,使用系統(tǒng)默認值會出現(xiàn)莫名奇怪的問題。
講文件描述符其實是為高深莫測的epoll做鋪墊,掌握epoll對進程已經(jīng)有很深的理解了。