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;

最多只能有 ZX_CHANNEL_MAX_MSG_IOVEC8192 wr_bytes 陣列的 zx_channel_iovec_t 元素,加總 所有zx_channel_iovec_tcapacity,未超過 ZX_CHANNEL_MAX_MSG_BYTES65536 個位元組。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]-&gt;handle 的控點不含 wr_handle[i]-&gt;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_byteswr_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_bytesrd_num_handles 過小 以包含回覆訊息。

ZX_ERR_NOT_SUPPORTED 帳號代碼的其中一個帳號代碼為「帳號代碼」 (寫入管道的帳號代碼)。