blob: 23e23fd2f90bfdd62905cf96a7a549f110df2191 [file] [log] [blame] [view] [edit]
# 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