天天看點

Linux檔案共享(六)——描述符傳遞

注:轉載請注明出處   作者:lvyilong316

首先,我們先來讨論一個問題——程序間傳遞檔案描述符究竟傳遞的是什麼?

我們從傳遞描述符函數的參數來看是個fd,我們知道fd是打開檔案指針的在數組中的下标,是一個整數,那麼我們僅僅是把一個整數傳遞給另一個程序嗎?答案肯定是否定的,因為僅僅是傳遞整數值,沒有必要專門去實作一個api。至于深層次的的原因,我們可以想一下,假如接受程序僅僅收到的是一個整數值,他能知道什麼,又能做什麼呢?即使它知道這是來自另一個程序的一個打開檔案指針的下标,可是它還是不能知道這個下标在另一個程序中對應的是哪個打開檔案,其次,這個下标對接收程序本身毫無意義,因為在接受程序中這個下标(fd)可能已經被其他打開檔案占用。

我們又知道當我們将一個檔案描述符傳遞給另一個程序後,檔案的“通路計數”會增加,這和什麼有點像?沒錯,dup。對于程序間傳遞檔案描述符我們可以看作跨程序的dup調用,也就是同一個file對象在不同程序間的映射,這和兩個程序打開同一個檔案的結果相同,隻是接受檔案描述符的程序少了open的步驟而已,而對于網絡接口傳回的描述符,也隻能采取傳遞檔案描述符的方法。unix 系統中有兩個辦法來完成這個任務:

bsd   sendmsg, recvmsg 方法。

sysv  ioctl 方法。

     當一個程序向另一個程序傳送一打開的檔案描述符時,我們想要發送程序和接收程序共享同一檔案表項。下圖顯示了所希望的安排。

Linux檔案共享(六)——描述符傳遞

總結:程序間檔案描述符的傳遞,隻是通過核心将接收檔案的一個新的file指針指向和發送程序的同一個file對象,并使這個file對象的引用計數增加。

通過上一節分析線程間檔案共享,我們可以知道每個線程的同一個file指針下标,對應同一個file對象,同一個檔案在一個線程中是什麼狀态,在另一個線程(同一程序中)也是什麼狀态。是以線程間不需要傳遞檔案描述符,或者說僅僅通過fd值的傳遞即可達到傳遞描述符的效果(核心無需幹預)。

linux檔案共享總結:共享程度:

1.線程共享(共享files_struct結構)

2.程序間描述符傳遞、dup、父子程序共享打開檔案(共享file對象)

3.兩獨立程序打開同一檔案(共享dentry)

繼續閱讀