摘要
傳送訊息給管道並等待對方回覆。
宣告
#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
必須設為 0。
系統只會複製所有 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 陣列中的控點有重複。
ZX_ERR_WRONG_TYPE
處理常式不是管道控點,也不是 wr_handles 中的來源處理常式與物件類型類型不符。
ZX_ERR_INVALID_ARGS
提供的任何指標為無效或空值,或 wr_num_bytes 小於四、options 非零,或者 wr_handles[i]->handle 中的任何來源帳號代碼都沒有 wr_handle[i]->rights 中指定的權利。如果指定 ZX_CHANNEL_WRITE_USE_IOVEC
選項,如果 buffer 欄位包含無效指標,或保留欄位不是零,就會產生 ZX_ERR_INVALID_ARGS
。
ZX_ERR_ACCESS_DENIED
「處理常式」不含 ZX_RIGHT_WRITE
,或「處理常式」中的任何元素都沒有 ZX_RIGHT_TRANSFER
。
ZX_ERR_PEER_CLOSED
管道另一側在等待回覆時關閉或關閉。
ZX_ERR_CANCELED
帳號代碼在等待回覆時失效 (例如已結束)。
ZX_ERR_NO_MEMORY
因記憶體不足而失敗。使用者空間無法以任何方式處理這個錯誤 (極可能) 錯誤。日後的建構作業不會再發生這個錯誤。
ZX_ERR_OUT_OF_RANGE
wr_num_bytes 或 wr_num_handles 大於系統允許的最大管道訊息大小。如果指定 ZX_CHANNEL_WRITE_USE_IOVEC
選項,如果 num_bytes 大於 ZX_CHANNEL_MAX_MSG_IOVEC
,或生物容量總和超過 ZX_CHANNEL_MAX_MSG_BYTES
,就會產生 ZX_ERR_OUT_OF_RANGE
。
ZX_ERR_BUFFER_TOO_SMALL
rd_num_bytes 或 rd_num_handles 太小,因此無法包含回覆訊息。
ZX_ERR_NOT_SUPPORTED
帳號代碼中的其中一個控點是「控制代碼」 (指向寫入管道的控制代碼)。