UNPv1第十四章:Unix域协议

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域套接字上接收这个描述符,传递描述字不是传递描述字的编号,而是在接收进程中创建一个新的描述字,指向内核的文件表中与发送进程发送的描述字相同的项。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值