1. 程式人生 > >APUE讀書筆記-第17章-高階程序間通訊

APUE讀書筆記-第17章-高階程序間通訊

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