zx_channel_call_etc

总结

向频道发送消息并等待回复。

声明

#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_byteszx_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_IOVEC8192zx_channel_iovec_t 元素,并且所有 zx_channel_iovec_tcapacity 总和不超过 ZX_CHANNEL_MAX_MSG_BYTES65536 个字节。buffer 不需要对齐,而且当 capacity 为零时,它只能为 NULLreserved 必须设置为零。

要么复制所有 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_bytesactual_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_byteswr_num_handles 大于通道消息允许的大小上限。如果指定了 ZX_CHANNEL_WRITE_USE_IOVEC 选项,则当 num_bytes 大于 ZX_CHANNEL_MAX_MSG_IOVEC 或 iovec 容量之和超过 ZX_CHANNEL_MAX_MSG_BYTES 时,会生成 ZX_ERR_OUT_OF_RANGEnum_bytes

ZX_ERR_BUFFER_TOO_SMALL rd_num_bytesrd_num_handles 太小,无法包含回复消息。

ZX_ERR_NOT_SUPPORTED handles 中的一个句柄是 handle(要写入到的通道的句柄)。