PTY(伪终端)可模拟终端设备,其中“服务器”端(代表终端的键盘和显示器端,通过打开 /dev/misc/ptmx 来获取)和多个“客户端”端(这些端通过调用 OpenClient
获得)。
客户端 PTY 由 OpenClient
调用中使用的 id
进行标识。第一个客户端 PTY 必须为 0,并且是唯一一个可以创建其他客户端 PTY、接收事件等的客户端 PTY。它是控制 PTY。
协议
设备
在 fuchsia.hardware.pty/pty.fidl 中定义
克隆 2
请求
名称 | 类型 |
---|---|
request |
server_end<fuchsia.unknown/Cloneable>
|
关闭
终止连接。
调用 Close
后,客户端不得发送任何其他请求。
服务器在发送状态响应后,无论处于何种状态,都应关闭连接,而不发送内容。
关闭渠道的客户端端在语义上应该等同于在不知道关闭何时完成或其状态的情况下调用 Close
。
请求
<空>
回复
名称 | 类型 |
---|---|
payload |
fuchsia.unknown/Closeable_Close_Result
|
ClrSetFeature
已针对客户端 PTY 启用
清除和/或设置 PTY 功能
请求
名称 | 类型 |
---|---|
clr |
uint32
|
set |
uint32
|
回复
名称 | 类型 |
---|---|
status |
zx/Status
|
features |
uint32
|
描述
请求
<空>
回复
名称 | 类型 |
---|---|
payload |
DeviceDescribeResponse
|
GetWindowSize
获取窗口大小(以字符单元格为单位)
请求
<空>
回复
名称 | 类型 |
---|---|
status |
zx/Status
|
size |
WindowSize
|
激活
可在控制 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
|
查询
请求
<空>
回复
名称 | 类型 |
---|---|
protocol |
vector<uint8>
|
已读
在跳转偏移量处最多读取 'count' 个字节。 跳转偏移量前移一段读取的字节数。
不变量
- 返回的
data.length
绝不会大于count
。 - 如果
data.length
小于count
,则表示定位偏移量在此操作中已到达文件末尾。 - 如果
data.length
为零,而count
不为 0,则表示跳转偏移量已位于或超出文件末尾,且无法读取任何数据。 - 如果
count
为零,服务器应执行所有检查以确保能够在不实际读取任何内容的情况下进行读取,并返回空的data
矢量。
此方法需要右侧的 Rights.READ_BYTES。
如果 count
大于 MAX_TRANSFER_SIZE
,则返回 ZX_ERR_OUT_OF_RANGE
。
请求
名称 | 类型 |
---|---|
count |
uint64
|
回复
名称 | 类型 |
---|---|
payload |
fuchsia.io/Readable_Read_Result
|
读取事件
返回待处理的 OOB 事件,同时将其清除
请求
<空>
回复
名称 | 类型 |
---|---|
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
|
结构
窗口大小
在 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 |
|
活动通话 |
1
|
uint32 |
终端没有活跃客户端。 |
事件中断 |
2
|
uint32 |
终端收到了 ^C 控制字符。 |
活动面具 |
15
|
uint32 |
所有活动 |
EVENT_SUSPEND |
4
|
uint32 |
终端收到了 ^Z 控制字符。 |
事件窗口大小 |
8
|
uint32 |
终端窗口的大小已调整。 |
FEATURE_RAW |
1
|
uint32 |
启用 Feature RAW 后,系统不会生成 ^c、^z 等 OOB 事件。 而是从 read() 输入路径中读取字符。 |