DOKK / manpages / debian 11 / manpages-zh / unix.7.zh_TW
UNIX(7) Linux程序員手冊 UNIX(7)

unix, PF_UNIX, AF_UNIX, PF_LOCAL, AF_LOCAL - 用於本地內部進程通訊的套接字。

#include <sys/socket.h>
#include <sys/un.h>

unix_socket = socket(PF_UNIX, type, 0);
error = socketpair(PF_UNIX, type, 0, int *sv);

PF_UNIX (也稱作 PF_LOCAL ) 套接字族用來在同一機器上的提供有效的進程間通訊.Unix 套接字可以是匿名的(由 socketpair(2) 創建), 也可以與套接字類型文件相關聯. Linux 還支持一種抽象名字空間, 它是獨立於文件系統的.

有效的類型有: SOCK_STREAM 用於面向流的套接字, SOCK_DGRAM 用於面向數據報的套接字,其可以保存消息界限. Unix 套接字總是可靠的,而且不會重組數據報.

Unix 套接字支持把文件描述符或者進程的信用證明作爲數據報的輔助數據 傳遞給其它進程.

unix 地址定義爲文件系統中的一個文件名 或者抽象名字空間中的一個單獨的字符串. 由 socketpair(2) 創建的套接字是匿名的.對於非匿名的套接字,目標地址可使用 connect(2) 設置. 本地地址可使用 bind(2) 設置. 當套接字連接上而且它沒有一個本地地址時, 會自動在抽象名字空間中生成一個唯一的地址.

#define UNIX_PATH_MAX   108
struct sockaddr_un {
sa_family_t     sun_family;     /* AF_UNIX */
char    sun_path[UNIX_PATH_MAX];        /* 路徑名 */
};

sun_family 總是包含 AF_UNIX. sun_path 包含空零結尾的套接字在文件系統中的路徑名. 如果 sun_path 以空零字節開頭,它指向由 Unix 協議模塊維護的抽象名字空間. 該套接字在此名字空間中的地址由 sun_path 中的剩餘字節給定. 注意抽象名字空間的名字都不是空零終止的.

由於歷史原因, 這些套接字選項通過 SOL_SOCKET 類型確定, 即使它們是 PF_UNIX 指定的. 它們可以由 setsockopt(2) 設置. 通過指定 SOL_SOCKET 作爲套接字族 用 getsockopt(2) 來讀取.

SO_PASSCRED 允許接收進程輔助信息發送的信用證明. 當設置了該選項且套接字尚未連接時, 則會自動生成一個抽象名字空間的唯一名字. 值爲一個整數布爾標識.

由於歷史原因,這些輔助信息類型通過 SOL_SOCKET 類型確定, 即使它們是 PF_UNIX 指定的. 要發送它們, 可設置結構 cmsghdrcmsg_level 字段爲 SOL_SOCKET, 並設置 cmsg_type 字段爲其類型. 要獲得更多信息, 請參看 cmsg(3).

爲其他進程發送或接收一套打開文件描述符. 其數據部分包含一個文件描述符的整型數組. 已傳文件描述符的效果就如它們已由 dup(2) 創建過一樣.

發送或者接收 unix 信用證明. 可用作認證.信用證明傳送以 struct ucred 輔助信息的形式傳送.

struct ucred {
pid_t   pid;     /* 發送進程的進程標識 */
uid_t   uid;     /* 發送進程的用戶標識 */
gid_t   gid;     /* 發送進程的組標識 */
};

發送者確定的信用證明由內核檢查. 一個帶有有效用戶標識 0 的進程允許指定不與其自身值相 匹配的值.發送者必須確定其自身的進程標識(除非它帶有 CAP_SYS_ADMIN), 其用戶標識,有效用戶標識或者設置用戶標識(除非它帶有 CAP_SETUID), 以及其組標識,有效組標識或者設置組標識(除非它帶有 CAP_SETGID). 爲了接收一條 struct ucred 消息,必須在套接字上激活 SO_PASSCRED 選項.

SCM_CREDENTIALS 和抽象名字空間是在 Linux 2.2 中引入的,不應該在要求可移植的程序中使用.

在 Linux 實現中, 在文件系統中可見的套接字擁有它們所在目錄的權限許可. 它們的所有者,組和權限可以作修改. 如果進程不擁有對創建的套接字所在目錄的寫和搜索(執行)權限, 則創建一個新的套接字會失敗. 這種執行方式與許多由 BSD 發展而來的系統不同, 那些系統會忽略 Unix 套接字所需的權限. 可移植的程序不應把這項功能用於安全方面.

綁定文件名到套接字會在文件系統中創建一個套接字, 這個套接字在它不再需要時必須由調用者 刪除(使用 unlink(2)). 通用的 Unix 相關語義可適用; 套接字可在任何時候刪除, 而且當最後一個引用關閉時, 最終會從文件系統中刪除.

要傳遞文件描述符或者信用證明, 你需要發送/讀取至少一個字節.

內存溢出.

connect(2) 調用了一個未在監聽的套接字對象. 這可能發生在遠程套接字不存在或者文件名不是套接字的時候.

傳遞了無效參數. 通常的產生原因是已傳地址的 sun_type 字段的 AF_UNIX 設置丟失, 或者套接字對應用的操作處於無效狀態.

在非面向流的套接字上調用了流操作,或者試圖使用出界的數據選項.

傳遞的協議是非 PF_UNIX 的.

未知的套接字類型.

遠程套接字與本地套接字類型不匹配 (SOCK_DGRAM 對 SOCK_STREAM).

選擇的本地地址已經佔用,或者文件系統套接字對象已經存在.

在一個已經連接的套接字上調用 connect(2) 或者指定的目標地址在一個已連接的套接字上.

套接字操作需要一個目的地址,但是套接字尚未連接.

遠程套接字意外關閉.
遠程套接字在一個流套接字上關閉了.如果激活,會同時發送一個 SIGPIPE 標識.這可以通過傳遞 MSG_NOSIGNAL 標識給 sendmsg(2) 或者 recvmsg(2) 來避免.
用戶內存地址無效.
發送者在 struct ucred 中傳遞無效的信用證明.

當生成一個文件系統套接字對象時, 可能會由通用套接層或者文件系統產生其它錯誤. 要獲得更多信息,可參見合適的手冊頁.

recvmsg(2), sendmsg(2), socket(2), socket(2), socketpair(2), cmsg(3), socket(7)

本man頁作者Andi Kleen.

riser <boomer@ccidnet.com>

2001/07/19

《中國linux論壇man手冊頁翻譯計劃》:

http://cmpp.linuxforum.net

本頁面中文版由中文 man 手冊頁計劃提供。
中文 man 手冊頁計劃:https://github.com/man-pages-zh/manpages-zh

1999年5月7日 Linux 手冊頁