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 指定的. 要發送它們, 可設置結構 cmsghdr 的 cmsg_level 字段爲 SOL_SOCKET, 並設置 cmsg_type 字段爲其類型. 要獲得更多信息, 請參看 cmsg(3).
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 相關語義可適用; 套接字可在任何時候刪除, 而且當最後一個引用關閉時, 最終會從文件系統中刪除.
要傳遞文件描述符或者信用證明, 你需要發送/讀取至少一個字節.
當生成一個文件系統套接字對象時, 可能會由通用套接層或者文件系統產生其它錯誤. 要獲得更多信息,可參見合適的手冊頁.
recvmsg(2), sendmsg(2), socket(2), socket(2), socketpair(2), cmsg(3), socket(7)
本man頁作者Andi Kleen.
riser <boomer@ccidnet.com>
2001/07/19
http://cmpp.linuxforum.net
本頁面中文版由中文
man 手冊頁計劃提供。
中文 man
手冊頁計劃:https://github.com/man-pages-zh/manpages-zh
1999年5月7日 | Linux 手冊頁 |