摘要
傳送訊息給管道,等待對方回覆。
宣告
#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;
最多只能有 ZX_CHANNEL_MAX_MSG_IOVEC
或 8192
wr_bytes
陣列的 zx_channel_iovec_t
元素,加總
所有zx_channel_iovec_t
的capacity
,未超過
ZX_CHANNEL_MAX_MSG_BYTES
或 65536
個位元組。buffer
不得對齊
如果 capacity
為 0,則只有 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
帳號代碼不是有效的帳號代碼,
handles 不是有效的帳號代碼,或是帳號代碼重複
handles 陣列中)。
「ZX_ERR_WRONG_TYPE
」帳號代碼不是管道帳號代碼或任何來源
wr_handles 中的處理常式與物件類型不符。
ZX_ERR_INVALID_ARGS
提供的任何指標無效或空值,
或 wr_num_bytes 小於 4,或者 options 為非零,或任何來源
wr_handles[i]->handle 的控點不含
wr_handle[i]->rights。
如果已指定 ZX_CHANNEL_WRITE_USE_IOVEC
選項,
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_ERR_OUT_OF_RANGE
ZX_CHANNEL_MAX_MSG_IOVEC
或生物容量的總和超過
ZX_CHANNEL_MAX_MSG_BYTES
。
ZX_ERR_BUFFER_TOO_SMALL
rd_num_bytes 或 rd_num_handles 過小
以包含回覆訊息。
ZX_ERR_NOT_SUPPORTED
帳號代碼的其中一個帳號代碼為「帳號代碼」
(寫入管道的帳號代碼)。