Zircon 通道定义
作者:互联网
NAME 命名
channel - 双向进程间通信
简介
通道是一种双向的消息传输,消息由一些字节数据和一些句柄组成。
描述
通道的两端都维护这一个有序的消息队列。消息由一些数据和一些句柄组成。调用[zx_channel_write()
]将一条消息入队,调用[zx_channel_read()
]将一条消息出列(如果队列中有的话)。线程可能会阻塞通过[zx_object_wait_one()
]等待消息或其它等待机制。
或者,调用[zx_channel_call()
]将消息入队通道的一个方向,等待相应的响应,以及使响应消息出列。在调用模式下,对应的响应通过消息的前4个字节标识,称为事务ID。内核为[zx_channel_call()
]写入的消息提供不同的事务ID(高位总是置位)。
通道发送信息的过程由两个步骤组成。首先是将消息数据原子的写入通道,并将消息中全部句柄的所有权迁移给通道:在调用结束时,所有句柄要么都在通道中,要么都被丢弃的。第二个操作,通道读取,是类似:成功时,下一条消息中的所有句柄都被原子移动到接收过程的句柄表中;故障时,通道保有所有权,除非指定了ZX_CHANNEL_READ_MAY_DISCARD选项,随后删除它们。
与许多其它内核对象类型不同,通道是不可复制的。这样只有一个句柄关联到句柄端点,持有句柄的进程为句柄的所有者。只有所有者才能写消息或发送句柄端点给另外一个进程。
此外,当通道端点的所有权从一个进程转移到另外进程,即使正在进行写入,也可以保证消息的顺序。转移事件之前的数据包来自前一个所有者和转移后的数据包属于新所有者。如果通道端点传输时正在进行读取操作,规则是类似的。
以上提到的顺序保证不包括其它内核对象,即使最后一个剩余的句柄被剥夺了ZX_RIGHT_DUPLICATE权限。
系统调用
- [
zx_channel_call()
] - 同步发送消息并接收答复 - [
zx_channel_create()
] - 创建新通道 - [
zx_channel_read()
] - 从通道接收消息 - [
zx_channel_write()
] - 向通道写入消息
- [
zx_object_wait_one()
] - 等待一个对象上的信号
标签:调用,定义,句柄,Zircon,zx,消息,channel,通道 来源: https://blog.csdn.net/sinat_20184565/article/details/93906984