Linux高级进程间通信:UNIX域套接字
UNIX域套接字简介
#include <sys/types.h> #include <sys/socket.h> int socketpair(int domain, int type, int protocol, int sockfd[2]);
注意:这里创建的非命名管道是一个全双工管道,即两个描述符分别既可以用于读,也可以用于写。如下是该函数使用的一个实例:
int fd[2]; pid_t pid; socketpair(AF_UNIX, SOCKET_STREAM, 0, fd); // 创建管道 if ( (pid = fork()) == 0) { // 子进程 close(fd[0]); // 关闭管道的父进程端 dup2(fd[1], STDOUT_FILENO); // 复制管道的子进程端到标准输出 dup2(fd[1], STDIN_FILENO); // 复制管道的子进程端到标准输入 close(fd[1]); // 关闭已复制的读管道 /* 使用exec执行命令 */ } else { // 父进程 close(fd[1]); // 关闭管道的子进程端 /* 现在可在fd[0]中读写数据 */ shutdown(fd[0], SHUT_WR); // 通知对端数据发送完毕 /* 读取剩余数据 */ close(fd[0]); // 关闭管道 /* 使用wait系列函数等待子进程退出并取得退出代码 */ }
传送文件描述符
struct msghdr { void *msg_name; int msg_namelen; struct iovec *msg_iov; __kernel_size_t msg_iovlen; void *msg_control; __kernel_size_t msg_controllen; unsigned msg_flags; };
其中,头两个元素通常用于在网络连接上发送数据报文,在这里,目的地址可以由每个数据报文指定。下面两个元素使我们可以指定由多个缓冲区构成的数组(散布读和聚集写)。msg_flags字段包含了说明所接受到消息的标志。
struct cmsghdr { socklen_t cmsg_len; /* data byte count, including header */ int cmsg_level; /* originating protocol */ int cmsg_type; /* protocol-specific type */ /* followed by unsigned char cmsg_data[]; */ };
为了发送文件描述符,将cmsg_len设置为cmsgghdr结构的长度加一个整型(描述符)的长度,cmsg_level字段设置为SOL_SOCKET,cmsg_type字段设置为SCM_RIGHTS,用以指明我们在传送访问权。(SCM指的是套接字级控制消息,socket_level control message。)访问权仅能通过UNIX域套接字传送。描述符紧随cmsg_type字段之后存放,用CMSG_DATA宏获取该整型量的指针。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。