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 手冊頁 |