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_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_IOVEC8192 zx_channel_iovec_t 個元素,所有 zx_channel_iovec_t 中的 capacity 總和不會超過 ZX_CHANNEL_MAX_MSG_BYTES65536 位元組。buffer 不必對齊,且只有在 capacity 為零時,可能為 NULLreserved 必須設為 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_bytesactual_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_byteswr_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_bytesrd_num_handles 太小,因此無法包含回覆訊息。

ZX_ERR_NOT_SUPPORTED 帳號代碼中的其中一個控點是「控制代碼」 (指向寫入管道的控制代碼)。