閱讀567 返回首頁    go 魔獸


Linux文件共享(六)——描述符傳遞

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

5.1 進程間描述符傳遞

首先,我們先來討論一個問題——進程間傳遞文件描述符究竟傳遞的是什麼?

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

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

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

 

總結:進程間文件描述符的傳遞,隻是通過內核將接收文件的一個新的file指針指向和發送進程的同一個file對象,並使這個file對象的引用計數增加。

5.2 線程間描述符傳遞

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

 

Linux文件共享總結:共享程度:

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

2.進程間描述符傳遞、dup、父子進程共享打開文件(共享file對象)

3.兩獨立進程打開同一文件(共享dentry


最後更新:2017-04-03 12:56:03

  上一篇:go NULL, 0, 空格與'0','\0'
  下一篇:go Cocos2d-x 3.0 新特性體驗-觸摸事件處理機製