17.1 引言
前面两章讨论了UNIX系统提供的各种IPC,包括管道和套接字。本章介绍两种高级IPC:基于STREAMS的管道(STREAMS-based pipe)以及UNIX域套接字(UNIX domain socket)。
17.2 基于STREAMS的管道
17.3 UNIX域套接字
UNIX域套接字用于在同一台机器上运行的进程之间的通信。虽然因特网域套接字可用于同一目的,但UNIX域套接字的效率更高。UNIX域套接字仅仅复制数据;他们并不执行协议处理,不需要添加或删除网络报头,无需计算检验和,不要产生顺序号,无需发送确认报文。
小结:采用UNIX域套接字进行进程间通信的原因在于 UNIX域套接字仅仅复制数据。
UNIX域套接字提供流和数据报两种接口。UNIX域数据报服务是可靠地,既不会丢失消息也不会传递出错。
小结:管道的缺陷有两个:1)半双工 2)必须由共同祖先的进程才能通信。为了解决这个缺陷使用UNIX域套接字,利用socketpair函数创建全双工管道。
17.3.1 命名UNIX域套接字
17.3.2 唯一连接
17.4 传送文件描述符
概述部分:关于文件共享的介绍
17.4.1 经由基于STREAMS的管道传送文件描述符
17.4.2 经由UNIX域套接字传送文件描述符
前面两章讨论了UNIX系统提供的各种IPC,包括管道和套接字。本章介绍两种高级IPC:基于STREAMS的管道(STREAMS-based pipe)以及UNIX域套接字(UNIX domain socket)。
17.2 基于STREAMS的管道
17.3 UNIX域套接字
UNIX域套接字用于在同一台机器上运行的进程之间的通信。虽然因特网域套接字可用于同一目的,但UNIX域套接字的效率更高。UNIX域套接字仅仅复制数据;他们并不执行协议处理,不需要添加或删除网络报头,无需计算检验和,不要产生顺序号,无需发送确认报文。
小结:采用UNIX域套接字进行进程间通信的原因在于 UNIX域套接字仅仅复制数据。
UNIX域套接字提供流和数据报两种接口。UNIX域数据报服务是可靠地,既不会丢失消息也不会传递出错。
UNIX域套接字是套接字和管道之间的混合物。为了创建一对非命名的、相互连接的UNIX域套接字,用户可以使用它们面向网络的域套接字接口,也可以使用socketpair函数。
#include <sys/socket.h>
int socketpair(int domain,int type,int protocol,int sockfd[2]);
return value: 若成功返回0,若出错返回-1.
小结:管道的缺陷有两个:1)半双工 2)必须由共同祖先的进程才能通信。为了解决这个缺陷使用UNIX域套接字,利用socketpair函数创建全双工管道。
17.3.1 命名UNIX域套接字
17.3.2 唯一连接
17.4 传送文件描述符
概述部分:关于文件共享的介绍
17.4.1 经由基于STREAMS的管道传送文件描述符
17.4.2 经由UNIX域套接字传送文件描述符
struct iovec { /* Scatter/gather array items */
void *iov_base; /* Starting address */
size_t iov_len; /* Number of bytes to transfer */
};
struct msghdr {
void *msg_name; /* optional address */
socklen_t msg_namelen; /* size of address */
struct iovec *msg_iov; /* scatter/gather array */
size_t msg_iovlen; /* # elements in msg_iov */
void *msg_control; /* ancillary data, see below */
socklen_t msg_controllen; /* ancillary data buffer len */
int msg_flags; /* flags on received message */
};
struct cmsghdr {(控制信息首部结构体 control-message-header)
socklen_t cmsg_len; /* data byte count, including hdr */
int cmsg_level; /* originating protocol */
int cmsg_type; /* protocol-specific type */
/* followed by
unsigned char cmsg_data[]; */
};
Here msg_name and msg_namelen specify the source address if the socket is unconnected.msg_name may be given as a null pointer if no names are desired or required.
如果socket是无连接的,那么msg_name和msg_namelen用于指定源地址。
The fields msg_iov and msg_iovlen describe scatter-gather locations, as discussed in readv(2)
msg_iov和msg_iovlen可以指定多个缓冲区构成的数组(散布读和聚集写)。
msg_flags字段包含了说明所接受到消息的标识,这些标识如表16-9中。
msg_control和msg_controllen控制信息的传送和接收。
msg_control字段指向cmsghdr(控制信息首部)结构,
msg_controllen字段包含控制信息的字节数。
为了发送文件描述符,
将cmsg_len设置为cmsghdr结构的长度加一个整型(描述符)的长度;
cmsg_level字段设置为SOL_SOCKET,
cmsg_type字段设置为SCM_RIGHTS,用以指明我们在传送访问权。(SCM:套接字级控制消息,socket_level_control_message)。访问权仅能通过UNIX域套接字传送。描述符紧随cmsg_type字段之后存放,用CMSG_DATA宏获得该整型量的指针。
http://blog.chinaunix.net/uid-1789246-id-2848202.html
本文介绍了UNIX域套接字的原理与应用,探讨了其作为进程间通信机制的优势,尤其是在同一台机器上的进程间通信。文章还详细解释了如何使用socketpair函数创建全双工管道,并介绍了如何通过UNIX域套接字传送文件描述符。
1471

被折叠的 条评论
为什么被折叠?



