- 1、本文档共22页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
【精选】第18章 Unix域协议:IO和描述符的传递
下载
第18章 Unix 域协议:I/O和描述符的传递
18.1 概述
本章继续描述上一章的 U n i x 域协议实现。本章的第一节讲述 I / O 、P R U _ S E N D和
P R U _ R C V D请求,其余部分介绍描述符传递。
18.2 P R U _ S E N D和P R U _ R C V D请求
无论什么时候,当一个进程给 U n i x 域插口发送数据或者控制信息时都要发出 P R U _ S E N D
请求。请求的第一部分首先处理控制信息,然后处理数据报插口,如图 1 8 - 1所示。
图18-1 数据报插口的 P R U _ s S E N D 请求
第1 8章 U n i x域协议:I / O 和描述符的传递计计211
下载
1. 初始化所有控制信息
1 4 1 - 1 4 2 如果进程使用 s e n d m s g发送控制信息,函数u n p _ i n t e r n a l i z e将嵌入的描述符
转换成 f i l e指针,我们将在 1 8 . 4节中描述这个函数。
2. 暂时连接一个无连接的数据报插口
1 4 6 - 1 5 3 如果进程传送一个带有目的地址的插口地址结构 (也就是说,n a m参数非空) ,那么
插口必须是无连接的,否则返回 E I S C O N N错误。通过u n p _ c o n n e c t连接无连接的插口。暂
时连接一个无连接的数据报插口的代码与卷 2 图2 3 - 1 5 的U D P代码相似。
1 5 4 - 1 5 9 如果进程没有传递一个目的地址,那么对于一个无连接的插口就返回 E N O T C O N N
错误。
3. 传递发送者的地址
1 6 0 - 1 6 4 s o 2指向目的插口的 s o c k e t结构。如果发送插口 (u n p) 已经绑定了一个路径名,
f r o m就指向包含路径名的 s o c k a d d r _ u n结构;否则, f r o m指向 s u n _ n o n a m e,
s u n _ n o n a m e是一个以空字节作为路径名首字符的 s o c k a d d r _ u n结构。
如果一个U n i x 域数据报的发送者没有绑定一个路径名到它的插口,数据报的接
收者由于没有目的地址(例如,路径名)而不能用 s e n d t o发送应答。这就与U D P不同,
当数据报第一次到达一个未绑定的数据报插口时,协议就会自动为其分配一个临时
的端口号。U D P 能为应用程序自动选择端口号的一个原因是这些端口号仅由 U D P 使
用。然而,文件系统中的路径名并不是仅为 U n i x 域插口保留。因而为一个没有绑定
的U n i x域插口自动选择路径名可能会在后面产生冲突。
是否需要一个应答取决于应用程序。例如, s y s l o g函数没有绑定一个路径名到
它的U n i x域数据报插口,它仅发送报文到本地 s y s l o g d守护进程而不想得到一个应
答。
4. 把控制、地址和数据m b u f添加到插口接收队列
1 6 5 - 1 7 0 s b a p p e n d a d d r将控制信息 (如果需要) 、发送者地址和数据添加到接收插口的接
收队列。如果函数调用成功, s o r w a k e u p就要唤醒所有等待这些数据的接收者,为了防止
m b u f 指针m和c o n t r o l在函数结束时被释放,将它们全置为 0 ( 图1 7 - 1 0 )。如果出现错误(可能
因为在接收队列上没有足够空间来存放数据、地址和控制信息 ) ,就返回E N O B U F S。
处理这种错误与 U D P 不同。如果在接收队列上没有足够的空间,使用 U n i x 域数
据报插口的 s e n d e r就会收到从它的输出操作返回的错误。同 U D P一样,如果在接口
输出队列上有足够的空间,那么发送者的输出操作就会成功。如果接收 U D P 发现在
接收插口的接收队列上没有空
文档评论(0)