Unix域套接字是很是有用的IPC機制,接口上使用socket API,和TCP/IP,UDP/IP保持一致,隨時能夠相互切換,可是Unix域套接字並不執行協議處理,不須要添加或刪除網絡報頭,無需計算校驗和,不要產生順序號,無需發送確認報文,所以要高效的多。相比其餘IPC機制(管道,共享內存),它有下面的特色:git
1. 相比網絡傳輸它更安全,由於只能在本機使用,因此又稱Unix local socket;安全
2. 並不依賴網絡支持,不須要任何網絡環境和參數配置;服務器
3. 是全雙工的;網絡
4. 既支持面向鏈接的(steam)流式通信,又支持面向無鏈接的(datagram)socket通信;dom
5. 相比其餘IPC方式更安全:socket
* 服務端經過設置綁定的文件的文件權限(主要是應用umask調用)能夠限制特定用戶或組進行鏈接;ide
* 由於Unix域套接字整個流程都發生在同一個系統上,該系統內核所以知道鏈接端和被鏈接端雙端的一切事情。這意味着服務端能夠經過系統調用獲知連上來的客戶端的一些信息例如用戶id,用戶組id,進程id,服務端能夠依據這些來對相應客戶端進行受權。ui
6. 打開的文件描述符能夠能夠經過Unix域套接字在一個進程到另外一個進程之間傳遞;this
前面有說內核是知道Unix域套接字的鏈接雙方的,因而能夠在服務端經過這樣的系統調用來獲取客戶端的憑證(UID,GID,PID),進而進行權限認證,從而達到客戶端權限控制。這個系統調用就是通用的getsockopt,具體代碼以下(注意並非每個平臺支持如下的代碼):unix
struct ucred credentials; int ucred_length = sizeof(struct ucred); /* fill in the user data structure */ if(getsockopt(connection_fd, SOL_SOCKET, SO_PEERCRED, &credentials, &ucred_length)) { printf("could obtain credentials from unix domain socket"); return 1; } /* the process ID of the process on the other side of the socket */ credentials.pid; /* the effective UID of the process on the other side of the socket */ credentials.uid; /* the effective primary GID of the process on the other side of the socket */ credentials.gid; /* To get supplemental groups, we will have to look them up in our account database, after a reverse lookup on the UID to get the account name. We can take this opportunity to check to see if this is a legit account. */
文件描述符傳遞毫不是隻是把一個數值的文件描述符號從一個進程傳遞到另外一個進程,而是以下圖所示,接收進程可能使用了一個不一樣的文件描述符號,可是指向了同一個文件表項,也就是兩個進程共享該文件的狀態標誌,當前偏移量。其實實際中文件描述符傳遞用的比較少,具體用法在文檔中有清晰描述就再也不復述。