Provided by:
manpages-zh_1.5.1-2_all 
NAME(SYNOPSIS()
#include <sys/socket.h>
#include <sys/un.h>
unix_socket = socket(PF_UNIX, type, 0);
error = socketpair(PF_UNIX, type, 0, int *sv);
DESCRIPTION()
PF_UNIX (也称作 PF_LOCAL )
å¥—æŽ¥å—æ—用æ¥åœ¨åŒä¸€æœºå™¨ä¸Šçš„æä¾›æœ‰æ•ˆçš„进程间通讯.Unix
套接å—å¯ä»¥æ˜¯åŒ¿åçš„(ç”± socketpair(2) 创建),
也å¯ä»¥ä¸Žå¥—接å—类型文件相关è”. Linux 还支æŒä¸€ç§æŠ½è±¡åå—空间,
它是独立于文件系统的.
有效的类型有: SOCK_STREAM 用于é¢å‘æµçš„套接å—, SOCK_DGRAM
用于é¢å‘æ•°æ®æŠ¥çš„å¥—æŽ¥å—,å…¶å¯ä»¥ä¿å˜æ¶ˆæ¯ç•Œé™. Unix
å¥—æŽ¥å—æ€»æ˜¯å¯é çš„,而且ä¸ä¼šé‡ç»„æ•°æ®æŠ¥.
Unix å¥—æŽ¥å—æ”¯æŒæŠŠæ–‡ä»¶æè¿°ç¬¦æˆ–è€…è¿›ç¨‹çš„ä¿¡ç”¨è¯æ˜Žä½œä¸ºæ•°æ®æŠ¥çš„辅助数æ®
ä¼ é€’ç»™å…¶å®ƒè¿›ç¨‹ï¼Ž
ADDRESS FORMAT()
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 ä¸çš„剩余å—节给定.
æ³¨æ„æŠ½è±¡åå—空间的åå—éƒ½ä¸æ˜¯ç©ºé›¶ç»ˆæ¢çš„.
SOCKET OPTIONS()
由于历å²ç ¸, 这些套接å—选项通过 SOL_SOCKET 类型确定, å³ä½¿å®ƒä»¬æ˜¯ PF_UNIX
指定的. 它们å¯ä»¥ç”± setsockopt(2) 设置. 通过指定 SOL_SOCKET
ä½œä¸ºå¥—æŽ¥å—æ— 用 getsockopt(2) æ¥è¯»å–.
SO_PASSCRED å…许接收进程辅助信æ¯å‘é€çš„ä¿¡ç”¨è¯æ˜Ž.
当设置了该选项且套接å—尚未连接时,
则会自动生æˆä¸€ä¸ªæŠ½è±¡åå—空间的唯一åå—. å€¼ä¸ºä¸€ä¸ªæ•´æ•°å¸ƒå°”æ ‡è¯†.
ANCILLARY MESSAGES()
由于历å²ç ¸,这些辅助信æ¯ç±»åž‹é€šè¿‡ 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 选项.
VERSIONS()
SCM_CREDENTIALS 和抽象åå—空间是在 Linux 2.2
ä¸å¼•入的,ä¸åº”è¯¥åœ¨è¦æ±‚å¯ç§»æ¤çš„程åºä¸ä½¿ç”¨.
NOTES()
在 Linux 实现ä¸, 在文件系统ä¸å¯è§çš„å¥—æŽ¥å—æ‹¥æœ‰å®ƒä»¬æ‰€åœ¨ç›®å½•çš„æƒé™è®¸å¯.
它们的所有者,组和æƒé™å¯ä»¥ä½œä¿®æ”¹.
å¦‚æžœè¿›ç¨‹ä¸æ‹¥æœ‰å¯¹åˆ›å»ºçš„å¥—æŽ¥å—æ‰€åœ¨ç›®å½•的写和æœç´¢(执行)æƒé™,
则创建一个新的套接å—会失败. è¿™ç§æ‰§è¡Œæ–¹å¼ä¸Žè®¸å¤šç”± BSD
å‘展而æ¥çš„系统ä¸åŒ, 那些系统会忽略 Unix å¥—æŽ¥å—æ‰€éœ€çš„æƒé™.
å¯ç§»æ¤çš„程åºä¸åº”把这项功能用于安全方é¢ï¼Ž
绑定文件å到套接å—会在文件系统ä¸åˆ›å»ºä¸€ä¸ªå¥—接å—,
这个套接å—在它ä¸å†éœ€è¦æ—¶å¿…须由调用者 åˆ é™¤(使用 unlink(2)). 通用的 Unix
相关è¯ä¹‰å¯é€‚用; 套接å—å¯åœ¨ä»»ä½•æ—¶å€™åˆ é™¤, 而且当最åŽä¸€ä¸ªå¼•ç”¨å…³é—æ—¶,
最终会从文件系统ä¸åˆ 除.
è¦ä¼ 递文件æè¿°ç¬¦æˆ–è€…ä¿¡ç”¨è¯æ˜Ž, ä½ éœ€è¦å‘é€/读å–至少一个å—节.
ERRORS()
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 ä¸ä¼ é€’æ— æ•ˆçš„ä¿¡ç”¨è¯æ˜Ž.
当生æˆä¸€ä¸ªæ–‡ä»¶ç³»ç»Ÿå¥—接å—对象时,
å¯èƒ½ä¼šç”±é€šç”¨å¥—接层或者文件系统产生其它错误.
è¦èŽ·å¾—æ›´å¤šä¿¡æ¯,å¯å‚è§åˆé€‚的手册页.
SEE ALSO()
recvmsg(2), sendmsg(2), socket(2), socket(2), socketpair(2), cmsg(3),
socket(7)
CREDITS()
本man页作者Andi Kleen.
[riser <boomer@ccidnet.com>
[2001/07/19
ã€å䏿³å›é·linuxan:
http://cmpp.linuxforum.net