摘要
撰寫一則訊息給某個管道。
宣告
#include <zircon/syscalls.h>
zx_status_t zx_channel_write_etc(zx_handle_t handle,
uint32_t options,
const void* bytes,
uint32_t num_bytes,
zx_handle_disposition_t* handles,
uint32_t num_handles);
說明
就像 zx_channel_write()
一樣,它會嘗試寫入 num_bytes 的訊息
位元組和 num_handles 會處理 handle 指定的管道,但
它就會對執行中的
透過 控點,也就是 zx_handle_disposition_t
陣列進行轉移:
typedef struct zx_handle_disposition {
zx_handle_op_t operation;
zx_handle_t handle;
zx_obj_type_t type;
zx_rights_t rights;
zx_status_t result;
} zx_handle_disposition_t;
在 zx_handle_disposition_t 中,handle 是要操作的來源控制代碼,
rights 是您要的最終權利 (而非遮罩),且必須設定 result
至 ZX_OK
。所有來源帳號代碼都必須有 ZX_RIGHT_TRANSFER
,但
你可以在權利中移除該訊息,這樣一來,訊息中就不會提供該訊息
接收器。
type 的用途是驗證呼叫端的物件類型
預期為 handle 。如要略過驗證,請按 ZX_OBJ_TYPE_NONE
檢查或其中一個 zx_obj_type_t
定義的類型。
套用至 handle 的作業為下列任一項目:
ZX_HANDLE_OP_MOVE
這相當於先核發zx_handle_replace()
zx_channel_write()
。來源帳號代碼一律關閉。ZX_HANDLE_OP_DUPLICATE
這相當於首次核發的zx_handle_duplicate()
再按zx_channel_write()
。來源控點一律保持開啟,且可供 呼叫。
帳號代碼將會移轉具有能力 right,也就是 ZX_RIGHT_SAME_RIGHTS
或縮減權利組合,或ZX_RIGHT_NONE
另外,這項作業
權利中的 ZX_RIGHT_TRANSFER
,表示接收器無法使用能力。
如果有任何作業失敗,該來源控制代碼的錯誤代碼會寫入 result,且
第一次失敗時會傳回 zx_channel_write_etc()
的傳回值。所有語言
系統會嘗試執行 handles 陣列中的作業,即使一或多項作業失敗也一樣。
每個項目的所有作業都必須成功,才能寫入訊息。成功時,控制代碼 全部附加在郵件上,並成為「 和整個管道的相對關係
如果在 handles 陣列 (訊息中傳送的控制代碼)。
訊息中可傳送的帳號代碼數量上限為 ZX_CHANNEL_MAX_MSG_HANDLES
個,
64。
在訊息中可傳送的位元組數量上限為 ZX_CHANNEL_MAX_MSG_BYTES
個,
也就是 65536
郵件遭 zx_channel_read()
或 zx_channel_read_etc()
排除。無法排除
訊息及時出現可能會導致使用的核心記憶體過多,
例外狀況。詳情請參閱 ipc 限制。
ZX_CHANNEL_WRITE_USE_IOVEC 選項
如果指定 ZX_CHANNEL_WRITE_USE_IOVEC
選項,系統會為 bytes
會解讀為 zx_channel_iovec_t
的陣列,並指定至
並按照順序複製到訊息中num_bytes
會指定
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
bytes
陣列的 zx_channel_iovec_t
元素和 capacity
的總和
所有zx_channel_iovec_t
(不超過 ZX_CHANNEL_MAX_MSG_BYTES
)
65536
位元組。buffer
不需要對齊,只有在符合以下條件時,才是 NULL
capacity
為零。「reserved
」必須設為零。
系統會複製所有zx_channel_iovec_t
並傳送訊息,或是完全不傳送
而且訊息不會傳送。傳送帳號代碼的使用方式維持不變。
權限
handle 必須是 ZX_OBJ_TYPE_CHANNEL
類型,且包含 ZX_RIGHT_WRITE
。
每個帳號代碼都必須具備 ZX_RIGHT_TRANSFER
。
傳回值
zx_channel_write_etc()
會在成功時傳回 ZX_OK
。
錯誤
ZX_ERR_BAD_HANDLE
帳號代碼不是有效的帳號代碼,
handles 不是有效的帳號代碼,或是有重複的帳號代碼
如果沒有 ZX_HANDLE_OP_DUPLICATE
旗標,則在 handles 陣列中。
ZX_ERR_WRONG_TYPE
帳號代碼不是管道帳號代碼或任何來源帳號代碼
在 handles 中,與物件類型 type 不符。
ZX_ERR_INVALID_ARGS
bytes 是無效的指標,處理常式
是無效的指標,或 options 不是零,或 operation 不是
必須是 ZX_HANDLE_OP_MOVE 或 ZX_HANDLE_OP_DUPLICATE 之一,或任何來源
handles[i]->handle 的帳號代碼並未指定
whandle[i]->rights 上。
如果已指定 ZX_CHANNEL_WRITE_USE_IOVEC
選項,
ZX_ERR_INVALID_ARGS
如果緩衝區欄位含有
指標無效,或是保留欄位不是零。
handles 陣列包含 ZX_ERR_NOT_SUPPORTED
帳號代碼。
ZX_ERR_ACCESS_DENIED
帳號代碼沒有 ZX_RIGHT_WRITE
或
帳號代碼中的任何來源控制代碼都沒有 ZX_RIGHT_TRANSFER
;或
在發生以下情況時,帳號代碼中的任何來源控制代碼沒有 ZX_RIGHT_DUPLICATE
已指定 ZX_HANDLE_OP_DUPLICATE
作業。
ZX_ERR_PEER_CLOSED
管道的另一側已關閉。
ZX_ERR_NO_MEMORY
因記憶體不足而失敗。
使用者空間無法妥善處理這種 (異常) 錯誤。
在日後的版本中不會再發生這個錯誤。
ZX_ERR_OUT_OF_RANGE
num_bytes 或 num_handles 大於
ZX_CHANNEL_MAX_MSG_BYTES
或 ZX_CHANNEL_MAX_MSG_HANDLES
。
如果已指定 ZX_CHANNEL_WRITE_USE_IOVEC
選項,
如果num_bytes大於ZX_ERR_OUT_OF_RANGE
ZX_CHANNEL_MAX_MSG_IOVEC
或生物容量的總和超過
ZX_CHANNEL_MAX_MSG_BYTES
。
附註
如果呼叫端移除附加於控制代碼的 ZX_RIGHT_TRANSFER
訊息讀取者收到的控點,無法
寫入其他管道,但還是能根據
且可視需要關閉