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).
- SCM_RIGHTS
- 為其他程序傳送或接收一套開啟檔案描述符.
其資料部分包含一個檔案描述符的整型陣列.
已傳檔案描述符的效果就如它們已由
dup(2) 建立過一樣.
- SCM_CREDENTIALS
- 傳送或者接收 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 相關語義可適用;
套接字可在任何時候刪除,
而且當最後一個引用關閉時,
最終會從檔案系統中刪除.
要傳遞檔案描述符或者信用證明,
你需要傳送/讀取至少一個位元組.
- ENOMEM
- 記憶體溢位.
- ECONNREFUSED
-
connect(2)
呼叫了一個未在監聽的套接字物件.
這可能發生在遠端套接字不存在或者檔名不是套接字的時候.
- EINVAL
- 傳遞了無效引數.
通常的產生原因是已傳地址的
sun_type 欄位的 AF_UNIX
設定丟失,
或者套接字對應用的操作處於無效狀態.
- EOPNOTSUPP
- 在非面向流的套接字上呼叫了流操作,或者試圖使用出界的資料選項.
- EPROTONOSUPPORT
- 傳遞的協議是非
PF_UNIX 的.
- ESOCKTNOSUPPORT
- 未知的套接字型別.
- EPROTOTYPE
- 遠端套接字與本地套接字型別不匹配
(SOCK_DGRAM 對 SOCK_STREAM).
- EADDRINUSE
- 選擇的本地地址已經佔用,或者檔案系統套接字物件已經存在.
- EISCONN
- 在一個已經連線的套接字上呼叫
connect(2)
或者指定的目標地址在一個已連線的套接字上.
- ENOTCONN
- 套接字操作需要一個目的地址,但是套接字尚未連線.
- ECONNRESET
- 遠端套接字意外關閉.
- EPIPE
- 遠端套接字在一個流套接字上關閉了.如果啟用,會同時傳送一個
SIGPIPE
標識.這可以透過傳遞
MSG_NOSIGNAL 標識給 sendmsg(2)
或者 recvmsg(2) 來避免.
- EFAULT
- 使用者記憶體地址無效.
- EPERM
- 傳送者在 struct ucred
中傳遞無效的信用證明.
當生成一個檔案系統套接字物件時,
可能會由通用套接層或者檔案系統產生其它錯誤.
要獲得更多資訊,可參見合適的手冊頁.
recvmsg(2),
sendmsg(2),
socket(2),
socket(2),
socketpair(2),
cmsg(3),
socket(7)
本man頁作者Andi Kleen.
riser <[email protected]>
2001/07/19
http://cmpp.linuxforum.net
本頁面中文版由中文 man
手冊頁計劃提供。
中文 man 手冊頁計劃:
https://github.com/man-pages-zh/manpages-zh