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 手册页 |