PTY(伪终端)可模拟终端设备,它具有“服务器”端(表示终端的键盘+显示器端,通过打开 /dev/misc/ptmx 获得)和多个“客户端”(通过调用 OpenClient 获得)。
客户端 PTY 由 OpenClient 调用中使用的 id 标识。第一个客户端 PTY 必须为 0,并且是唯一允许创建其他客户端 PTY、接收事件等的客户端 PTY。它是控制 PTY。
PROTOCOLS
设备
在 fuchsia.hardware.pty/pty.fidl 中定义
克隆
请求
| 名称 | 类型 | 
|---|---|
| request | server_end:fuchsia.unknown/Cloneable | 
关闭
终止连接。
调用 Close 后,客户端不得发送任何其他请求。
服务器在发送状态响应后,应关闭连接,无论状态如何,且不发送墓志铭。
关闭通道的客户端端在语义上应等同于调用 Close,而无需知道关闭何时完成或其状态。
请求
<EMPTY>
响应
| 名称 | 类型 | 
|---|---|
| payload | fuchsia.unknown/Closeable_Close_Result | 
ClrSetFeature
允许在客户端 PTY 上使用
清除和/或设置 PTY 功能
请求
| 名称 | 类型 | 
|---|---|
| clr | uint32 | 
| set | uint32 | 
响应
| 名称 | 类型 | 
|---|---|
| status | zx/Status | 
| features | uint32 | 
描述
请求
<EMPTY>
响应
| 名称 | 类型 | 
|---|---|
| payload | DeviceDescribeResponse | 
GetWindowSize
获取窗口大小(以字符单元格为单位)
请求
<EMPTY>
响应
| 名称 | 类型 | 
|---|---|
| status | zx/Status | 
| size | WindowSize | 
MakeActive
允许在控制 PTY 上使用
选择哪个客户端 PTY 接收输入。 读取操作将简单地阻塞非活跃 PTY。
请求
| 名称 | 类型 | 
|---|---|
| client_pty_id | uint32 | 
响应
| 名称 | 类型 | 
|---|---|
| status | zx/Status | 
OpenClient
打开具有唯一 id 的客户端 PTY 设备。client 应该是通道的一个端点的句柄,该端点(在成功时)将成为与新创建的设备的开放连接。如果失败,通道将关闭。关闭通道会关闭连接并释放设备。如果提供的 id 为 0,则新客户端是控制客户端,并且能够打开其他客户端。如果当前设备不是控制客户端,则返回 ZX_ERR_ACCESS_DENIED。如果 id 不唯一,则返回 ZX_ERR_INVALID_ARGS。
否则,将传递 device_add 中的状态代码。
请求
| 名称 | 类型 | 
|---|---|
| id | uint32 | 
| client | server_end:Device | 
响应
| 名称 | 类型 | 
|---|---|
| s | zx/Status | 
查询
请求
<EMPTY>
响应
| 名称 | 类型 | 
|---|---|
| protocol | vector<uint8> | 
读取
在搜索偏移量处读取最多“count”个字节。 搜索偏移量会向前移动读取的字节数。
不变量
- 返回的 data.length永远不会大于count。
- 如果 data.length小于count,则表示在此操作中,搜索偏移量已到达文件末尾。
- 如果 data.length为零,而count不为零,则表示查找偏移量已位于文件末尾或超出文件末尾,无法读取任何数据。
- 如果 count为零,服务器应执行所有检查,确保读取访问权限,但实际上不读取任何内容,并返回一个空的data向量。
此方法需要 Rights.READ_BYTES 权限。
如果 count 大于 MAX_TRANSFER_SIZE,则返回 ZX_ERR_OUT_OF_RANGE。
请求
| 名称 | 类型 | 
|---|---|
| count | uint64 | 
响应
| 名称 | 类型 | 
|---|---|
| payload | fuchsia.io/Readable_Read_Result | 
ReadEvents
返回待处理的 OOB 事件,同时清除这些事件
请求
<EMPTY>
响应
| 名称 | 类型 | 
|---|---|
| status | zx/Status | 
| events | uint32 | 
SetWindowSize
允许在服务器 PTY 上使用
设置窗口大小
请求
| 名称 | 类型 | 
|---|---|
| size | WindowSize | 
响应
| 名称 | 类型 | 
|---|---|
| status | zx/Status | 
写入
在查找偏移量处写入数据。 搜索偏移量会向前移动写入的字节数。 如果文件处于附加模式,则首先将查找偏移量设置为文件末尾,然后执行写入操作,这两个步骤在一个原子步骤中完成。
如果查找偏移量加上 data.length 超出当前文件末尾,文件大小可能会增大。
- 请求 data要写入文件的字节缓冲区。
- 响应 actual_count写入的字节数。
不变量
- 返回的 actual_count永远不会大于data.length。
- 如果服务器因空间不足等原因而无法写入所有数据,则 actual_count可能小于data.length。如果无法写入任何字节,则返回错误。
- 如果 data.length为零,服务器应执行所有检查,确保写入访问权限,而不更改文件,并返回成功写入零字节。如果处于附加模式,仍会更新搜索偏移量。
此方法需要 Rights.WRITE_BYTES 权限。
请求
| 名称 | 类型 | 
|---|---|
| data | fuchsia.io/Transfer | 
响应
| 名称 | 类型 | 
|---|---|
| payload | fuchsia.io/Writable_Write_Result | 
STRUCTS
WindowSize
在 fuchsia.hardware.pty/pty.fidl 中定义
| 字段 | 类型 | 说明 | 默认 | 
|---|---|---|---|
| width | uint32 | 无默认值 | |
| height | uint32 | 无默认值 | 
表格
DeviceDescribeResponse 资源
在 fuchsia.hardware.pty/pty.fidl 中定义
| 序数 | 字段 | 类型 | 说明 | 
|---|---|---|---|
| 1 | event | handle<eventpair> | 一种可选事件,用于传输有关设备状态的信息。 您可以在此事件中观察到 DeviceSignal 值。 | 
常量
| 名称 | 值 | 类型 | 说明 | 
|---|---|---|---|
| DEVICE_PROTOCOL_NAME | fuchsia.hardware.pty/Device | String | 旧版协议名称。请改用生成的易于发现的协议名称。 已移除:下一步 | 
| EVENT_HANGUP | 1 | uint32 | 终端没有活跃的客户端。 | 
| EVENT_INTERRUPT | 2 | uint32 | 终端收到了 ^C 控制字符。 | 
| EVENT_MASK | 15 | uint32 | 所有活动 | 
| EVENT_SUSPEND | 4 | uint32 | 终端收到了 ^Z 控制字符。 | 
| EVENT_WINDOW_SIZE | 8 | uint32 | 终端窗口已调整大小。 | 
| FEATURE_RAW | 1 | uint32 | 启用“功能原始”后,不会生成 ^c、^z 等 OOB 事件。 而是从 read() 输入路径读取字符。 | 
服务
服务
在 fuchsia.hardware.pty/pty.fidl 中定义
| 名称 | 类型 | 传输 | 
|---|---|---|
| 设备 | fuchsia.hardware.pty/Device | 渠道 |