前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >UNPv1第十四章:Unix域协议

UNPv1第十四章:Unix域协议

作者头像
提莫队长
发布2019-02-21 11:04:20
4340
发布2019-02-21 11:04:20
举报
文章被收录于专栏:刘晓杰刘晓杰刘晓杰

Unix域协议并不是一个实际的协议族,它只是在同一台主机上进行客户-服务器通信时,使用与在不同主机上的客户和服务器间通信时相同的API(套接口或XTI)的一种方法。 当客户和服务器在同一台主机上时,Unix域协议是IPC通信方式的一种替代品。 Unix域提供了两种类型的套接口:字节流套接口(与TCP类似)和数据报套接口(与UDP类似)。

1.Unix域套接口地址结构

struct sockaddr_un {
   sa_family_t sun_family;     /* AF_LOCAL */
   char        sun_path[104];  /* null-terminated pathname */
};

存放sun_path数组中的路径名必须以空字符结尾

2.socketpair函数

socketpair函数建立一对相互连接的套接口,这个函数只对Unix域套接口使用。

#include <sys/socket.h>
int socketpair(int family, int type, int protocol, int sockfd[2]);
//返回: 成功返回0,出错返回-1

family必须为AF_LOCAL,protocol必须为0,type可以是SOCK_STREAM或SOCK_DGRAM,新创建的两个套接口描述字作为sockfd[0]和sockfd[1]返回 创建的两个套接口是没有名字的,即没有涉及隐式bind。 指定type参数为SOCK_STREAM调用socketpair所得到的结果称为流管道(stream pipe),这和一般的Unix管道(由pipe函数生成)类似,但流管道是全双工的,即两个描述字都是可读写的。

3.描述符传递

一般传递描述符的方法:

  1. 在fork调用后,子进程共享父进程的所有打开的描述字
  2. 在调用exec时所有描述字仍保持打开

第一个例子中进程打开一个描述字,调用fork,然后父进程关闭描述字,让子进程处理这个描述字。这样将一个打开的描述字从父进程传递到子进程。 两个进程之间传递描述符涉及的步骤: 1).创建一个字节流的或数据报的Unix域套接口 2).进程可以用任何返回描述字的Unix函数打开一个描述字:譬如open, pipe, mkfifo, socket或accept。 3).发送进程建立一个msghdr结构,其中包含要传递的描述字。 4).接收进程调用recvmsg在来自步骤1的Unix域套接字上接收这个描述符,传递描述字不是传递描述字的编号,而是在接收进程中创建一个新的描述字,指向内核的文件表中与发送进程发送的描述字相同的项。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016年04月26日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.Unix域套接口地址结构
  • 2.socketpair函数
  • 3.描述符传递
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档