第十七章 高级进程间通信

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域数据报服务是可靠地,既不会丢失消息也不会传递出错。     

     UNIX域套接字是套接字和管道之间的混合物。为了创建一对非命名的、相互连接的UNIX域套接字,用户可以使用它们面向网络的域套接字接口,也可以使用socketpair函数。

#include 
int socketpair(int domain,int type,int protocol,int sockfd[2]);
       return value: 若成功返回0,若出错返回-1.


为了得到全双工管道,我们必须直接调用socketpair。
    小结:管道的缺陷有两个: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环境高级编程笔记)