总结
向频道发送消息并等待回复。
声明
#include <zircon/syscalls.h>
zx_status_t zx_channel_call_etc(zx_handle_t handle,
uint32_t options,
zx_time_t deadline,
zx_channel_call_etc_args_t* args,
uint32_t* actual_bytes,
uint32_t* actual_handles);
说明
zx_channel_call_etc()
将请求写入通道并阻止,直到收到响应。它是 zx_channel_call()
的扩展,融合了 zx_channel_write_etc()
和 zx_channel_read_etc()
用于写入和读取阶段的功能,而不是更基本的 zx_channel_write()
和 zx_channel_read()
。如需查看信道调用的完整说明,请参阅 zx_channel_call()
。
调用 zx_channel_call_etc()
的效果类似于按顺序对 zx_channel_write_etc()
、zx_object_wait_one()
和 zx_channel_read_etc()
执行一系列调用。但主要区别在于,zx_channel_call_etc()
将等待传入消息与外发消息的事务 ID 匹配。本应提供给 zx_channel_read_etc()
和 zx_channel_write_etc()
的参数由 zx_channel_call_etc_args_t
指定:
typedef struct {
const void* wr_bytes;
zx_handle_disposition_t* wr_handles;
void *rd_bytes;
zx_handle_info_t* rd_handles;
uint32_t wr_num_bytes;
uint32_t wr_num_handles;
uint32_t rd_num_bytes;
uint32_t rd_num_handles;
} zx_channel_call_etc_args_t;
ZX_CHANNEL_WRITE_USE_IOVEC 选项
指定 ZX_CHANNEL_WRITE_USE_IOVEC
选项时,wr_bytes
会被解释为 zx_channel_iovec_t
的数组,用于指定要按顺序复制到消息的字节切片。num_wr_bytes
用于指定 wr_bytes
中 zx_channel_iovec_t
数组元素的数量。
typedef struct zx_channel_iovec {
const void* buffer; // User-space bytes.
uint32_t capacity; // Number of bytes.
uint32_t reserved; // Reserved.
} zx_channel_iovec_t;
wr_bytes
数组中最多只能有 ZX_CHANNEL_MAX_MSG_IOVEC
或 8192
个 zx_channel_iovec_t
元素,并且所有 zx_channel_iovec_t
的 capacity
总和不超过 ZX_CHANNEL_MAX_MSG_BYTES
或 65536
个字节。buffer
不需要对齐,而且当 capacity
为零时,它只能为 NULL
。reserved
必须设置为零。
要么复制所有 zx_channel_iovec_t
,然后发送消息;或者不复制任何值且不发送消息。发送标识名的用法保持不变。
权限
handle 必须为 ZX_OBJ_TYPE_CHANNEL
类型,具有 ZX_RIGHT_READ
且具有 ZX_RIGHT_WRITE
。
args 的所有 wr_handles 都必须具有 ZX_RIGHT_TRANSFER
。
返回值
zx_channel_call_etc()
会在成功时返回 ZX_OK
,回复消息中的字节数和句柄数分别通过 actual_bytes 和 actual_handles 返回。
错误
ZX_ERR_BAD_HANDLE
handle 不是有效的句柄,handles 中的任何元素都不是有效的句柄,或者 handles 数组中的句柄存在重复。
ZX_ERR_WRONG_TYPE
handle 不是通道句柄,或者 wr_handles 中的任何源句柄都与对象类型类型不匹配。
ZX_ERR_INVALID_ARGS
提供的任何指针无效或为 null,或 wr_num_bytes 小于 4,或者 options 为非零,或者 wr_handles[i]->handle 中的任何源句柄都没有 wr_handle[i]->rights 中指定的权限。
如果指定了 ZX_CHANNEL_WRITE_USE_IOVEC
选项,则当 buffer 字段包含无效指针或预留字段为非零时,将会生成 ZX_ERR_INVALID_ARGS
。
ZX_ERR_ACCESS_DENIED
handle 没有 ZX_RIGHT_WRITE
,或 handles 中的任何元素都没有 ZX_RIGHT_TRANSFER
。
ZX_ERR_PEER_CLOSED
通道的另一端在等待回复时已关闭或关闭。
等待回复时,ZX_ERR_CANCELED
标识名已失效(例如已关闭)。
ZX_ERR_NO_MEMORY
由于内存不足而失败。
用户空间没有什么方法来处理此(不太可能)错误。在以后的 build 中,此错误不会再发生。
ZX_ERR_OUT_OF_RANGE
wr_num_bytes 或 wr_num_handles 大于通道消息允许的大小上限。如果指定了 ZX_CHANNEL_WRITE_USE_IOVEC
选项,则当 num_bytes 大于 ZX_CHANNEL_MAX_MSG_IOVEC
或 iovec 容量之和超过 ZX_CHANNEL_MAX_MSG_BYTES
时,会生成 ZX_ERR_OUT_OF_RANGE
。num_bytes
ZX_ERR_BUFFER_TOO_SMALL
rd_num_bytes 或 rd_num_handles 太小,无法包含回复消息。
ZX_ERR_NOT_SUPPORTED
handles 中的一个句柄是 handle(要写入到的通道的句柄)。