zx_channel_read_etc

摘要

閱讀特定管道的訊息。

宣告

#include <zircon/syscalls.h>

zx_status_t zx_channel_read_etc(zx_handle_t handle,
                                uint32_t options,
                                void* bytes,
                                zx_handle_info_t* handles,
                                uint32_t num_bytes,
                                uint32_t num_handles,
                                uint32_t* actual_bytes,
                                uint32_t* actual_handles);

說明

如需完整說明,請參閱 zx_channel_read()

這兩種讀取方式的行為都相同,只是 zx_channel_read() 會傳回 原始 zx_handle_t 處理常式值陣列,zx_channel_read_etc() 會傳回 格式如下的 zx_handle_info_t 結構陣列:

typedef struct {
    zx_handle_t handle;     // handle value
    zx_obj_type_t type;     // type of object, see ZX_OBJ_TYPE_
    zx_rights_t rights;     // handle rights
    uint32_t unused;        // set to zero
} zx_handle_info_t;

如要透過管道與不受信任的對象溝通,則建議使用 系統會使用 zx_channel_read_etc() 表單,以及每種帳號代碼類型和權利 並根據預期值進行驗證

權限

handle 必須是 ZX_OBJ_TYPE_CHANNEL 類型,且包含 ZX_RIGHT_READ

傳回值

這兩種讀取方式在成功時都會傳回 ZX_OK (如果 actual_bytesactual_handles (如果不是空值),則包含確切的位元組數 和帳號讀取的數量

錯誤

ZX_ERR_BAD_HANDLE 帳號代碼不是有效的帳號代碼。

ZX_ERR_WRONG_TYPE 帳號代碼不是管道帳號代碼。

ZX_ERR_INVALID_ARGS 表示任何 byteshandlesactual_bytesactual_handles 是非空值且無效的指標。

ZX_ERR_ACCESS_DENIED 帳號代碼沒有 ZX_RIGHT_READ

ZX_ERR_SHOULD_WAIT 頻道不含任何可閱讀的訊息 即可開啟管道

ZX_ERR_PEER_CLOSED 頻道不含任何可閱讀的訊息 就會關閉管道

ZX_ERR_NO_MEMORY 因記憶體不足而失敗。 使用者空間無法妥善處理這種 (異常) 錯誤。 在日後的版本中不會再發生這個錯誤。

ZX_ERR_BUFFER_TOO_SMALL 提供的位元組處理常式緩衝區 太小 (在這種情況下,需接收的 這樣訊息就會寫入 actual_bytesactual_handles, (前提是空值並非空值)。如果選項包含ZX_CHANNEL_READ_MAY_DISCARD 便會遭到捨棄。

附註

num_handlesactual_handles 是元素數目 handles 陣列中,而不是以位元組為單位。

另請參閱