dev
Yu Chen 5 years ago
parent f4b8bc684a
commit a383d803a2

@ -5,7 +5,13 @@
[句柄]: https://github.com/zhangpf/fuchsia-docs-zh-CN/blob/master/zircon/docs/handles.md
[权限]: https://github.com/zhangpf/fuchsia-docs-zh-CN/blob/master/zircon/docs/rights.md
> 介绍并实现 HandleRights
对象可能有多个句柄(在一个或多个进程中)引用它们。
对于几乎所有的对象,当最后一个打开的引用对象的句柄关闭时,对象要么被销毁,要么被置于可能无法撤消的最终状态。
句柄可以从一个进程移动到另一个进程,方法是将它们写入通道(使用[`channel_write()`](https://fuchsia.dev/docs/reference/syscalls/channel_write)),或者使用 [`process_start()`](https://fuchsia.dev/docs/reference/syscalls/process_start)传递一个句柄作为新进程中第一个线程的参数。
可以对句柄或它所引用的对象采取的操作受与该句柄关联的权限管理。引用同一个对象的两个句柄可能具有不同的权限。
`Cargo.toml` 中加入 `bitflags` 库:

@ -1,5 +1,27 @@
# 对象传送器Channel 对象
## 概要
通道Channel是由一定数量的字节数据和一定数量的句柄组成的双向消息传输。
## 描述
通道有两个端点endpoints。从逻辑上讲每个端点都维护要读取的有序消息队列。写入一个端点会将消息排入另一个端点的队列中。当端点的最后一个句柄关闭时该端点队列中的未读消息将被销毁。因为销毁消息会关闭消息包含的所有句柄关闭通道端点可能会产生递归效果例如通道包含一条消息它包含一个通道它包含一条消息等等
关闭通道的最后一个句柄对先前写入该通道的消息的生命周期没有影响。这为通道提供了“即发即忘”的语义。
一条消息由一定数量的数据和一定数量的句柄组成。调用[`channel_write()`](https://fuchsia.dev/docs/reference/syscalls/channel_write)使一条消息入队,调用[`channel_read()`](https://fuchsia.dev/docs/reference/syscalls/channel_read) 使一条消息出列(如果有队列)。线程可以阻塞,直到消息通过[`object_wait_one()`](https://fuchsia.dev/docs/reference/syscalls/object_wait_one)或其他等待机制挂起。
或者,调用[`channel_call()`](https://fuchsia.dev/docs/reference/syscalls/channel_call)在通道的一个方向上将消息入队等待相应的响应然后将响应消息出队。在调用模式call mode相应的响应通过消息的前 4 个字节标识,称为事务 IDtransaction ID。内核使用[`channel_call()`](https://fuchsia.dev/docs/reference/syscalls/channel_call),为消息提供唯一的事务 ID.
通过通道发送消息的过程有两个步骤。第一步是原子地将数据写入通道并将消息中所有句柄的所有权移到此通道中。此操作始终消耗句柄在调用结束时所有句柄要么全部在通道中要么全部丢弃。第二步操作通道读取channel read与第一步类似成功后下一条消息中的所有句柄都被原子地移动到接收进程的句柄表中。失败时通道将保留所有权然后它们将被删除。
与许多其他内核对象类型不同通道是不可复制的。因此只有一个句柄与通道端点相关联持有该句柄的进程被视为所有者owner。只有所有者可以读取或写入消息或将通道端点发送到另一个进程。
当通道端点的所有权从一个进程转移到另一个进程时,即使消息正在进行写入,消息也不会被重新排序或截断。转移事件之前的消息属于以前的所有者,转移之后的消息属于新的所有者。如果在传输端点时,正在进行消息读取,则之前描述的所有权转移方式同样适用。
即使最后剩余的句柄被剥夺了**DUPLICATE**权限,也不为其他内核对象提供上述顺序保证。
## 创建一对内核对象
> 实现 Channel::create

Loading…
Cancel
Save