linux共享文件

linux共享文件

在linux中有不少種方式共享文件,可是底層原理都是經過描述符表,文件表, v-node表來實現的。接下來主要講解下這三張表中內容以及彼此之間的關係。在linux內核中,採用Descriptor table,File table,v-node table來表示打開的文件。node

Descriptor table

每一個進程都有一個 descriptor table(描述符表),其中的條目指向file table中的一條內容linux

file table

全部被打開的文件都在file table中表示,而且是由進程共享的。file table中的一條內容主要包括文件位置(文件內容的偏移量),在descriptor table中有多少條目指向此數據(reference count),指向v-node的指針。關閉一個描述符就是將reference count 減1,直到reference count的數目爲1,纔會將descriptor table中的對應條目刪除。函數

v-node table

v-node table也是由全部進程共享的。v-node table中的每一個條目都包含了一個文件的大部份內容,如文件權限,讀寫時間等等;相似於stat結構中的內容。3d

下面介紹幾個例子來具體看下文件共享時,三個表之間的關係指針

打開不一樣的文件

下圖表示了一個進程打開了兩個文件。stdin,stdout,stderr分別表示標準輸入,標準輸出,標準錯誤。即fd1標準輸出指向文件A,fd3描述符指向文件B 圖1code

不一樣的描述符打開同一個文件

圖2

能夠看到file table中的兩個條目指向了同一個v-node table中的一個元素 若是咱們對於同一個文件連續調用兩次open函數,就能夠獲得圖中所示的關係。因爲每一個文件描述符都有其本身的文件位置,因此每一個文件描述符能夠讀取文件不一樣的部分blog

父進程和子進程中三個表的關係

若是對於圖1的進程,咱們調用fork函數,則會出現下面的關係 圖3進程

能夠看到子進程內的內容徹底是父進程的一份拷貝ip

dup2函數

dup2函數能夠進行文件的重定向,好比將標準輸出重定向到文件等,這個在咱們平時的開發過程當中常常能夠碰到。其函數原型以下:開發

#include <unistd.h>
// returns: nonnegative descriptor if OK, -1 on error
int dup2(int oldfd, int newfd);

dup2函數將oldfd拷貝到newfd中,覆蓋newfd中以前的記錄;若是newfd已經打開了,則dup2會將newfd先關閉而後在拷貝。對於圖1,咱們執行dup2(4, 1), 結果以下所示: 圖4

能夠看到兩個描述符都指向了文件B,文件A已經關閉了,而且文件A對應的file table和v-node table中的條目也已經刪除了。文件B的reference count變成了2. 任何寫到標準輸出的內容都被重定向到文件B中。

相關文章
相關標籤/搜索