# 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 have two endpoints. Each endpoint, logically, maintains an ordered
queue of messages to be read. Writing to an endpoint enqueues a message in the
other endpoint's queue. When the last handle to an endpoint is closed the unread
messages in that endpoint's queue are destroyed. Because destroying a message
closes any handles contained by the message, closing a channel endpoint may have
a recursive effect (e.g. channel contains a message, which contains a channel,
which contains a message, and so on).

Closing the last handle to a channel has no impact on the lifetime of messages
previously written to that channel. This gives channels "fire and forget"
semantics.

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.

When ownership of a channel endpoint moves from one process to another,
messages will not be reordered or truncated, even if a write is in progress.
Messages before the transfer event belong to the previous owner and messages
after the transfer belong to the new owner.
The same applies if a read is in progress when the endpoint is 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
