前兩天跟老師去北京開了一個會議,好久沒學習了,今天才回學校,其中的辛酸就不說了。來正文:
1、什么是文件共享
(1)、文件共享就是同一個文件(同一個文件指的是同一個inode,同一個pathname)被多個獨立的讀寫體(幾乎可以理解為多個文件描述符)去同時(一個打開尚未關閉的同時,另一個去操作)操作。
(2)、文件共享的意義有很多:例如我們可以通過文件共享來實現多線程同時操作同一個大文件,以減少文件讀寫時間,提升效率。
2、文件共享的3種實現方式
(1)、文件共享的核心就是怎么弄出來多個文件描述符指向同一個文件。
(2)、常見的有三種文件共享的情況:
第一種就是同一個進程中多次使用open打開同一個文件,多次使用open時的返回值不一樣;(分別讀/寫)
第二種就是在不同進程中分別使用open打開同一個文件(這時候因為兩個fd在不同的進程中,所以兩個fd的數字可以相同也可以不同);(分別讀/寫)
第三種情況就是linux系統提供了dup和dup2兩個API來讓進程復制文件描述符。(接續讀/寫)
3、再論文件描述符
(1)、文件描述符的本質就是一個數字,這個數字本質上是進程表中文件描述符表的一個表項,進程通過文件描述符作為index去索引查表得到文件表指針,再間接訪問得到這個文件對應的文件表。
(2)、文件描述符這個數字是open系統調用內部由操作系統自動分配的,操作系統分配這個fd時,也不是隨意分配,也是遵照一定的規律的,我們現在就要研究這個規律。
(3)、操作系統規定,fd從0開始依次增加。fd也有最大限制的,在linux的早期版本中(0.11)fd最大是20,所以當時一個進程最多允許打開20個文件。linux中文件描述符表是個數組(不是鏈表),所以這個文件描述符表其實就是一個數組,fd是index,文件表指針是value。
(4)、當我們去open時,內核會從文件描述符表中挑選一個最小的未被使用的數字給我們返回。也就是說如果之前fd已經占滿了0-9,那么下次我們open得到的一定是10。(但是如果上一個fd得到的是9,下一個不一定是10,這是因為可能前邊一個更小的fd已經被close釋放掉了)。
(5)、fd中0、1、2已經默認被系統占用了,因此用戶進程得到的最小的fd就是3了。
(6)、linux內核占用了0、1、2這三個fd是有用的,當我們運行一個程序得到一個進程時,內部就默認打開了這三個文件,這三個文件對應的fd就是0、1、2。這三個文件分別叫stdin、stdout、stderr。也就是標准輸入、標准輸出、標准錯誤。
(7)、標准輸入一般對應的是鍵盤(可以理解為:0這個fd對應的是鍵盤的設備文件)
標准輸出一般是LCD顯示器(可以理解為:1對應LCD的設備文件)
(8)、printf函數其實就是默認輸出到標准輸出stdout上了。stdio中還有一個函數叫fprintf,這個函數就可以指定輸出到哪一個文件描述符中。