摘要
傳送訊息給管道,等待對方回覆。
宣告
#include <zircon/syscalls.h>
zx_status_t zx_channel_call_etc(zx_handle_t handle,
uint32_t options,
zx_instant_mono_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 帳號代碼的其中一個帳號代碼為「帳號代碼」
(寫入管道的帳號代碼)。