17.1 引言
*兩種進階IPC:基於STREAMS的管道(STREAMS-based pipe)以及UNIX域通訊端(UNIX domain socket)可以在進程間傳送開啟檔案描述符。服務進程可以使它們的開啟檔案描述符與指定的名字相關聯,客戶進程可以使用這些名字與服務進程通訊
17.2 基於STREAMS的管道
*可以用fattach函數給STREAMS管道一個檔案系統中的名字
*一旦STREAMS管道串連到檔案系統名字空間,那麼原來該名字的底層檔案就不再可訪問的。開啟改名字的任一進程將能訪問相應管道,而不是訪問原先的檔案。在調用fattach之前開啟底層檔案的任一進程可以繼續訪問該檔案
*雖然fattach函數可將任何種類的STREAMS檔案描述符與檔案系統中的一個名字相串連,但它最主要用於將一個名字給予一STREAMS管道
*在調用fdetach函數之後,先前依靠開啟path而能訪問STREAMS管道的進程仍可繼續訪問該管道,但是在此之後開啟path的進程將訪問駐留在檔案系統中的底層檔案
17.3 UNIX域通訊端
*UNIX域通訊端用於在同一台機器上啟動並執行進程之間的通訊
*UNIX域通訊端提供流和資料包兩種介面
*當我們將一地址綁定至UNIX域通訊端時,系統用該路徑名建立一類型為S_IFSOCK的檔案。該檔案僅用於向客戶進程告知通訊端名字。該檔案不能開啟,也不能由應用程式用於通訊。如果當我們試圖綁定地址時,該檔案已經存在,那麼bind請求失敗。當關閉通訊端時,並不自動刪除該檔案,所以我們必須確保在應用程式終止前,對該檔案執行解除連結操作
17.4 傳送檔案描述符
*當一個進程(通常是伺服器處理序)希望將一個描述符傳送給另一個進程時,它調用send_fd或send_err,等待接收描述符的進程(客戶進程)調用recv_fd
17.5 open伺服器版本1
*使用檔案描述符傳送技術,我們開發了一個open伺服器:一個由一個進程執行以開啟一個或幾個檔案的程式。該伺服器不是將檔案內容送回調用進程,而是送回一個開啟檔案描述符。這使該伺服器對任何類型的檔案(例如一個裝置或通訊端)而不單是普通檔案都能起作用。這也意味著,用IPC交換了最小量的資訊——從客戶進程到伺服器處理序傳送檔案名稱和開啟模式,而從伺服器處理序到客戶進程返回描述符。檔案內容不需用IPC傳送
17.6 open伺服器版本2
*open伺服器版本2是一個以守護進程方式啟動並執行open伺服器。用一個伺服器處理序處理所以客戶進程的請求。這一設計應該更加有效,因為沒有使用fork和exec