| # Channel | |
| ## NAME | |
| channel - Bidirectional interprocess communication | |
| ## SYNOPSIS | |
| A channel is a bidirectional transport of messages consisting of some | |
| amount of byte data and some number of handles. | |
| ## DESCRIPTION | |
| Channels maintain an ordered queue of messages to be delivered in either | |
| direction. A message consists of some amount of data and some number of handles. | |
| A call to [`zx_channel_write()`] enqueues one message, and a call to | |
| [`zx_channel_read()`] dequeues one message (if any are queued). A thread can block | |
| until messages are pending via [`zx_object_wait_one()`] or other waiting | |
| mechanisms. | |
| Alternatively, a call to [`zx_channel_call()`] enqueues a message in one | |
| direction of the channel, waits for a corresponding response, and | |
| dequeues the response message. In call mode, corresponding responses | |
| are identified via the first 4 bytes of the message, called the | |
| transaction ID. The kernel supplies distinct transaction IDs (always with the | |
| high bit set) for messages written with [`zx_channel_call()`]. | |
| The process of sending a message via a channel has two steps. The first is to | |
| atomically write the data into the channel and move ownership of all handles in | |
| the message into this channel. This operation always consumes the handles: at | |
| the end of the call, all handles either are all in the channel or are all | |
| discarded. The second operation, channel read, is similar: on success | |
| all the handles in the next message are atomically moved into the | |
| receiving process' handle table. On failure, the channel retains | |
| ownership unless the **ZX_CHANNEL_READ_MAY_DISCARD** option | |
| is specified, then they are dropped. | |
| Unlike many other kernel object types, channels are not duplicatable. Thus, there | |
| is only ever one handle associated with a channel endpoint, and the process holding | |
| that handle is considered the owner. Only the owner can read or write messages or send | |
| the channel endpoint to another process. | |
| Furthermore, when ownership of a channel endpoint goes from one process to | |
| another, even if a write was in progress, the ordering of messages is guaranteed | |
| to be parsimonious; messages before the transfer event originate from the | |
| previous owner and messages after the transfer belong to the new owner. The same | |
| applies if a read was in progress when the endpoint was transferred. | |
| The above sequential guarantee is not provided for other kernel objects, even if | |
| the last remaining handle is stripped of the **ZX_RIGHT_DUPLICATE** right. | |
| ## SYSCALLS | |
| - [`zx_channel_call()`] - synchronously send a message and receive a reply | |
| - [`zx_channel_create()`] - create a new channel | |
| - [`zx_channel_read()`] - receive a message from a channel | |
| - [`zx_channel_write()`] - write a message to a channel | |
| <br> | |
| - [`zx_object_wait_one()`] - wait for signals on one object | |
| ## SEE ALSO | |
| + [Zircon concepts](/docs/concepts/kernel/concepts.md) | |
| + [Handles](/docs/concepts/kernel/handles.md) | |
| [`zx_channel_call()`]: /docs/reference/syscalls/channel_call.md | |
| [`zx_channel_create()`]: /docs/reference/syscalls/channel_create.md | |
| [`zx_channel_read()`]: /docs/reference/syscalls/channel_read.md | |
| [`zx_channel_write()`]: /docs/reference/syscalls/channel_write.md | |
| [`zx_object_wait_one()`]: /docs/reference/syscalls/object_wait_one.md |