blob: fc628e5a4b44881720f6b86a1cfef393f535c362 [file] [log] [blame]
<head>
<title>intro(1) - Plan 9 from User Space</title>
<meta content="text/html; charset=utf-8" http-equiv=Content-Type>
</head>
<body bgcolor=#ffffff>
<table border=0 cellpadding=0 cellspacing=0 width=100%>
<tr height=10><td>
<tr><td width=20><td>
<tr><td width=20><td><b>INTRO(1)</b><td align=right><b>INTRO(1)</b>
<tr><td width=20><td colspan=2>
<br>
<p><font size=+1><b>NAME </b></font><br>
<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>
intro &ndash; introduction to Plan 9 from User Space<br>
</table>
<p><font size=+1><b>DESCRIPTION </b></font><br>
<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>
Plan 9 is a distributed computing environment built at Bell Labs
starting in the late 1980s. The system can be obtained from Bell
Labs at <tt><font size=+1>http://plan9.bell&#8722;labs.com/plan9</font></tt> and runs on PCs and a
variety of other platforms. Plan 9 became a convenient platform
for experimenting with new ideas,
applications, and services.
<table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
Plan 9 from User Space provides many of the ideas, applications,
and services from Plan 9 on Unix-like systems. It runs on FreeBSD
(x86), Linux (x86 and PowerPC), Mac OS X (PowerPC), OpenBSD (x86),
and SunOS (Sparc).<br>
<p><font size=+1><b>Commands </b></font><br>
Plan 9 from User Space expects its own directory tree, conventionally
<tt><font size=+1>/usr/local/plan9</font></tt>. When programs need to access files in the tree,
they expect the <tt><font size=+1>$PLAN9</font></tt> environment variable to contain the name
of the root of the tree. See <a href="../man1/install.html"><i>install</i>(1)</a> for details about installation.
<table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
Many of the familiar Unix commands, for example <a href="../man1/cat.html"><i>cat</i>(1)</a>, <a href="../man1/ls.html"><i>ls</i>(1)</a>,
and <a href="../man1/wc.html"><i>wc</i>(1)</a>, are present, but in their Plan 9 forms: <i>cat</i> takes no
arguments, <i>ls</i> does not columnate its output when printing to a
terminal, and <i>wc</i> counts UTF characters. In some cases, the differences
are quite noticeable: <a href="../man1/grep.html"><i>grep</i>(1)</a> and <a href="../man1/sed.html"><i>sed</i>(1)</a> expect Plan 9
regular expressions (see <a href="../man7/regexp.html"><i>regexp</i>(7)</a>), which are closest to what
Unix calls extended regular expressions. Because of these differences,
it is not recommended to put <tt><font size=+1>$PLAN9/bin</font></tt> before the usual system
<tt><font size=+1>bin</font></tt> directories in your search path. Instead, put it at the end
of your path and use the <a href="../man1/9.html"><i>9</i>(1)</a> script when you want to
invoke the Plan 9 version of a traditional Unix command.
<table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
Occasionally the Plan 9 programs have been changed to adapt to
Unix. <a href="../man1/Mk.html"><i>Mk</i>(1)</a> now allows mkfiles to choose their own shell, and
<a href="../man1/rc.html"><i>rc</i>(1)</a> has a <i>ulimit</i> builtin and manages <tt><font size=+1>$PATH</font></tt>.
<table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
Many of the graphical programs from Plan 9 are present, including
<a href="../man1/sam.html"><i>sam</i>(1)</a> and <a href="../man1/acme.html"><i>acme</i>(1)</a>. An X11 window manager <a href="../man1/rio.html"><i>rio</i>(1)</a> mimics Plan 9&#8217;s
window system, with command windows implemented by the external
program <a href="../man1/9term.html"><i>9term</i>(1)</a>. Following the style of X Windows, these programs
run in new windows rather than the one in
which they are invoked. They all take a <tt><font size=+1>&#8722;W</font></tt> option to specify the
size and placement of the new window. The argument is one of <i>width</i><tt><font size=+1>x</font></tt><i>height</i>,
<i>width</i><tt><font size=+1>x</font></tt><i>height</i><tt><font size=+1>@</font></tt><i>xmin</i><tt><font size=+1>,</font></tt><i>xmax</i>, or <i>xmin</i><tt><font size=+1>,</font></tt><i>ymin</i><tt><font size=+1>,</font></tt><i>xmax</i><tt><font size=+1>,</font></tt><i>ymax</i>.
<table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
The <a href="../man4/plumber.html"><i>plumber</i>(4)</a> helps to connect the various Plan 9 programs together,
and fittings like <a href="../man1/web.html"><i>web</i>(1)</a> connect it to external programs such
as web browsers; one can click on a URL in <i>acme</i> and see the page
load in <i>Firefox</i>.<br>
<p><font size=+1><b>User-level file servers </b></font><br>
In Plan 9, user-level file servers present file trees via the
Plan 9 file protocol, 9P. Processes can mount arbitrary file servers
and customize their own name spaces. These facilities are used
to connect programs. Clients interact with file servers by reading
and writing files.
<table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
This cannot be done directly on Unix. Instead the servers listen
for 9P connections on Unix domain sockets; clients connect to
these sockets and speak 9P directly using the <a href="../man3/9pclient.html"><i>9pclient</i>(3)</a> library.
<a href="../man4/Intro.html"><i>Intro</i>(4)</a> tells more of the story. The effect is not as clean as
on Plan 9, but it gets the job done and still provides a uniform
and
easy-to-understand mechanism. The <a href="../man1/9p.html"><i>9p</i>(1)</a> client can be used in
shell scripts or by hand to carry out simple interactions with
servers.<br>
<p><font size=+1><b>External databases </b></font><br>
Some programs rely on large databases that would be cumbersome
to include in every release. Scripts are provided that download
these databases separately. These databases can be downloaded
separately. See <tt><font size=+1>$PLAN9/dict/README</font></tt> and <tt><font size=+1>$PLAN9/sky/README</font></tt>.<br>
<p><font size=+1><b>Programming </b></font><br>
The shell scripts <i>9c</i> and <i>9l</i> (see <a href="../man1/9c.html"><i>9c</i>(1)</a>) provide a simple interface
to the underlying system compiler and linker, similar to the <i>2c</i>
and <i>2l</i> families on Plan 9. <i>9c</i> compiles source files, and <i>9l</i> links
object files into executables. When using Plan 9 libraries, <i>9l</i>
infers the correct set of libraries from the object files, so
that no <tt><font size=+1>&#8722;l
</font></tt>options are needed.
<table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
The only way to write multithreaded programs is to use the <a href="../man3/thread.html"><i>thread</i>(3)</a>
library. <a href="../man3/Rfork.html"><i>Rfork</i>(3)</a> exists but is not as capable as on Plan 9. There
are many unfortunate by necessary preprocessor diversions to make
Plan 9 and Unix libraries coexist. See <a href="../man3/intro.html"><i>intro</i>(3)</a> for details.
<table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
The debuggers <a href="../man1/acid.html"><i>acid</i>(1)</a> and <a href="../man1/db.html"><i>db</i>(1)</a> and the debugging library <a href="../man3/mach.html"><i>mach</i>(3)</a>
are works in progress. They are platform-independent, so that
x86 Linux core dumps can be inspected on PowerPC Mac OS X machines,
but they are also fairly incomplete. The x86 target is the most
mature; initial PowerPC support exists; and other
targets are unimplemented. The debuggers can only inspect, not
manipulate, target processes. Support for operating system threads
and for 64-bit architectures needs to be rethought. On x86 Linux
systems, <i>acid</i> and <i>db</i> can be relied upon to produce reasonable
stack traces (often in cases when GNU <i>gdb</i> cannot) and
dump data structures, but that it is the extent to which they
have been developed and exercised.<br>
<p><font size=+1><b>Porting programs </b></font><br>
The vast majority of the familiar Plan 9 programs have been ported,
including the Unicode-aware <a href="../man1/troff.html"><i>troff</i>(1)</a>.
<table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
Of the more recent additions to Plan 9, the <a href="../man1/secstore.html"><i>secstore</i>(1)</a> client
has been ported, though <i>secstored</i> has not. <a href="../man1/Vac.html"><i>Vac</i>(1)</a> has been ported,
though <i>vacfs</i> has not. <i>Factotum</i> and <i>venti</i> are in progress.
<table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
A backup system providing a dump file system built atop Venti
is also in progress.<br>
<p><font size=+1><b>Porting to new systems </b></font><br>
Porting the tree to new operating systems or architectures should
be straightforward, as system-specific code has been kept to a
minimum. The largest pieces of system-specific code are <tt><font size=+1>&lt;u.h&gt;</font></tt>, which
must include the right system files and set up the right integer
type definitions, and <i>libthread</i>, which must implement
spin locks, operating system thread creation, and context switching
routines. Portable implementations of these using <tt><font size=+1>&lt;pthread.h&gt;</font></tt> and
<tt><font size=+1>&lt;ucontext.h&gt;</font></tt> already exist. If your system supports them, you may
not need to write any system specific code at all.
<table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
There are other smaller system dependencies, such as the terminal
handling code in <a href="../man1/9term.html"><i>9term</i>(1)</a> and the implementation of <a href="../man3/getcallerpc.html"><i>getcallerpc</i>(3)</a>,
but these are usually simple and are not on the critical path
for getting the system up and running.<br>
</table>
<p><font size=+1><b>SEE ALSO </b></font><br>
<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>
The rest of this manual describes Plan 9 from User Space. Many
of the man pages have been brought from Plan 9, but they have
been updated, and others have been written from scratch.
<table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
The manual pages are in a Unix style tree, with names like <tt><font size=+1>$PLAN9/man/man1/cat.1</font></tt>
instead of Plan 9&#8217;s simpler <tt><font size=+1>$PLAN9/man/1/cat</font></tt>, so that the Unix
<a href="../man1/man.html"><i>man</i>(1)</a> utility can handle it. Some systems, for example Debian
Linux, deduce the man page locations from the search path, so
that adding <tt><font size=+1>$PLAN9/bin</font></tt> to
your path is sufficient to cause <tt><font size=+1>$PLAN9/man</font></tt> to be consulted for
manual pages using the system <i>man</i>. On other systems, or to look
at manual pages with the same name as a system page, invoke the
Plan 9 <i>man</i> directly, as in <tt><font size=+1>9 man cat</font></tt>.
<table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
The manual sections follow the Unix numbering conventions, not
the Plan 9 ones.
<table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
<a href="../man1">Section (1)</a> describes general publicly accessible commands.
<table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
<a href="../man3">Section (3)</a> describes C library functions.
<table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
<a href="../man4">Section (4)</a> describes user-level file servers.
<table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
<a href="../man7">Section (7)</a> describes file formats and protocols. (On Unix, section
(5) is technically for file formats but seems now to be used for
describing specific files.)
<table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
<a href="../man9">Section (9p)</a> describes the Plan 9 file protocol 9P.<br>
</table>
<p><font size=+1><b>DIAGNOSTICS </b></font><br>
<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>
In Plan 9, a program&#8217;s exit status is an arbitrary text string,
while on Unix it is an integer. Section (1) of this manual describes
commands as though they exit with string statuses. In fact, exiting
with an empty status corresponds to exiting with status 0, and
exiting with any non-empty string corresponds to exiting with
status 1. See <a href="../man3/exits.html"><i>exits</i>(3)</a>.<br>
</table>
<td width=20>
<tr height=20><td>
</table>
<!-- TRAILER -->
<table border=0 cellpadding=0 cellspacing=0 width=100%>
<tr height=15><td width=10><td><td width=10>
<tr><td><td>
<center>
<a href="../../"><img src="../../dist/spaceglenda100.png" alt="Space Glenda" border=1></a>
</center>
</table>
<!-- TRAILER -->
</body></html>