blob: b0b9459d7d301f155f92b94abbc63af3dc97c2ce [file] [log] [blame] [view]
# Mojo handles (objects)
Mojo handles are analogous to Unix file descriptors or Windows `HANDLE`s. That
is, they are basically-opaque integers that a program can use to refer to system
resources. Like their Unix and Windows equivalents, a Mojo handle value only has
meaning within a given process.
That said, there are some differences:
* There is a single value, 0, that is guaranteed to never be a valid Mojo
handle. This is unlike Unix, where all negative file descriptors are usually
taken to be invalid, even if -1 is often taken to be the "canonical" invalid
file descriptor value.
* The allocation of Mojo handle values is not specified. This is unlike Unix,
where file descriptors are allocated sequentially, with the lowest (positive)
unused value allocated.
* Unlike Windows, there are no "pseudohandles". That is, there is no Mojo handle
value whose meaning is context dependent (within the same process).
* In general, Mojo handles need not be duplicatable, whereas their Unix and
Windows equivalents can universally be duplicated.
* Mojo handles can be sent across [message pipes](message_pipes.md). Unlike
sending file descriptors over Unix domain sockets (using `SCM_RIGHTS`), this
is done with transfer semantics: after a message with attached Mojo handles is
sent, the Mojo handle values become invalid in the sending process. (Even if
the receiving process is the same as the sending process, the received Mojo
handle values will probably be different from the values that were sent.)
* Mojo handles have a well-defined life-cycle, and are only invalidated by
either transfer across a message pipe (as above) or by closing them. Unlike
Unix's overloaded `close()` (which may fail due to data loss, i.e., inability
to flush), closing a (valid) Mojo handle never fails.