mirror of
https://github.com/9fans/plan9port.git
synced 2025-01-12 11:10:07 +00:00
395 lines
9.6 KiB
Groff
395 lines
9.6 KiB
Groff
.TH INTRO 3
|
|
.SH NAME
|
|
intro \- introduction to library functions
|
|
.SH SYNOPSIS
|
|
.nf
|
|
.B #include <u.h>
|
|
.PP
|
|
.B #include \fIany Unix headers\fR
|
|
.PP
|
|
.B #include <libc.h>
|
|
.PP
|
|
.B #include <auth.h>
|
|
.PP
|
|
.B #include <bio.h>
|
|
.PP
|
|
.B #include <draw.h>
|
|
.PP
|
|
.B #include <fcall.h>
|
|
.PP
|
|
.B #include <frame.h>
|
|
.PP
|
|
.B #include <mach.h>
|
|
.PP
|
|
.B #include <regexp.h>
|
|
.PP
|
|
.B #include <thread.h>
|
|
.fi
|
|
.SH DESCRIPTION
|
|
This section describes functions
|
|
in various libraries.
|
|
For the most part, each library is defined by a single C include
|
|
file, such as those listed above, and a single archive file containing
|
|
the library proper. The name of the archive is
|
|
.BI \*9/lib/lib x .a \f1,
|
|
where
|
|
.I x
|
|
is the base of the include file name, stripped of a leading
|
|
.B lib
|
|
if present.
|
|
For example,
|
|
.B <draw.h>
|
|
defines the contents of library
|
|
.BR \*9/lib/libdraw.a ,
|
|
which may be abbreviated when named to the loader as
|
|
.BR -ldraw .
|
|
In practice, each include file contains a magic pragma
|
|
that directs the loader to pick up the associated archive
|
|
automatically, so it is rarely necessary to tell the loader
|
|
which
|
|
libraries a program needs;
|
|
see
|
|
.IR 9c (1).
|
|
.PP
|
|
The library to which a function belongs is defined by the
|
|
header file that defines its interface.
|
|
The `C library',
|
|
.IR libc ,
|
|
contains most of the basic subroutines such
|
|
as
|
|
.IR strlen .
|
|
Declarations for all of these functions are
|
|
in
|
|
.BR <libc.h> ,
|
|
which must be preceded by
|
|
.RI ( needs )
|
|
an include of
|
|
.BR <u.h> .
|
|
The graphics library,
|
|
.IR draw ,
|
|
is defined by
|
|
.BR <draw.h> ,
|
|
which needs
|
|
.B <libc.h>
|
|
and
|
|
.BR <u.h> .
|
|
The Buffered I/O library,
|
|
.IR libbio ,
|
|
is defined by
|
|
.BR <bio.h> ,
|
|
which needs
|
|
.B <libc.h>
|
|
and
|
|
.BR <u.h> .
|
|
The ANSI C Standard I/O library,
|
|
.IR libstdio ,
|
|
is defined by
|
|
.BR <stdio.h> ,
|
|
which needs
|
|
.BR <u.h> .
|
|
There are a few other, less commonly used libraries defined on
|
|
individual pages of this section.
|
|
.PP
|
|
The include file
|
|
.BR <u.h> ,
|
|
a prerequisite of several other include files,
|
|
declares the architecture-dependent and -independent types, including:
|
|
.IR uchar ,
|
|
.IR ushort ,
|
|
and
|
|
.IR ulong ,
|
|
the unsigned integer types;
|
|
.IR schar ,
|
|
the signed char type;
|
|
.I vlong
|
|
and
|
|
.IR uvlong ,
|
|
the signed and unsigned very long integral types;
|
|
.IR Rune ,
|
|
the Unicode character type;
|
|
.IR u8int ,
|
|
.IR u16int ,
|
|
.IR u32int ,
|
|
and
|
|
.IR u64int ,
|
|
the unsigned integral types with specific widths;
|
|
.IR jmp_buf ,
|
|
the type of the argument to
|
|
.I setjmp
|
|
and
|
|
.IR longjmp ,
|
|
plus macros that define the layout of
|
|
.IR jmp_buf
|
|
(see
|
|
.IR setjmp (3));
|
|
.\" definitions of the bits in the floating-point control register
|
|
.\" as used by
|
|
.\" .IR getfcr (2);
|
|
and
|
|
the macros
|
|
.B va_arg
|
|
and friends for accessing arguments of variadic functions (identical to the
|
|
macros defined in
|
|
.B <stdarg.h>
|
|
in ANSI C).
|
|
.PP
|
|
Plan 9 and Unix use many similarly-named functions for different purposes:
|
|
for example, Plan 9's
|
|
.I dup
|
|
is closer to (but not exactly) Unix's
|
|
.IR dup2 .
|
|
To avoid name conflicts,
|
|
.B <libc.h>
|
|
defines many of these names as preprocessor macros to add a
|
|
.I p9
|
|
prefix,
|
|
so that
|
|
.I dup
|
|
becomes
|
|
.IR p9dup .
|
|
To disable this renaming,
|
|
.B #define
|
|
.B NOPLAN9DEFINES
|
|
before including
|
|
.BR <libc.h> .
|
|
If Unix headers must be included in a program,
|
|
they should be included after
|
|
.BR <u.h> ,
|
|
which sets important preprocessor directives
|
|
(for example, to enable 64-bit file offsets),
|
|
but before
|
|
.BR <libc.h> ,
|
|
to avoid renaming problems.
|
|
.SS "Name space
|
|
Files are collected into a hierarchical organization called a
|
|
.I "file tree
|
|
starting in a
|
|
.I directory
|
|
called the
|
|
.IR root .
|
|
File names, also called
|
|
.IR paths ,
|
|
consist of a number of
|
|
.BR / -separated
|
|
.I "path elements"
|
|
with the slashes corresponding to directories.
|
|
A path element must contain only printable
|
|
characters (those outside the control spaces of
|
|
.SM ASCII
|
|
and Latin-1).
|
|
A path element cannot contain a slash.
|
|
.PP
|
|
When a process presents a file name to Plan 9, it is
|
|
.I evaluated
|
|
by the following algorithm.
|
|
Start with a directory that depends on the first
|
|
character of the path:
|
|
.L /
|
|
means the root of the main hierarchy,
|
|
and anything else means the process's current working directory.
|
|
Then for each path element, look up the element
|
|
in the directory, advance to that directory,
|
|
do a possible translation (see below), and repeat.
|
|
The last step may yield a directory or regular file.
|
|
.SS "File I/O"
|
|
Files are opened for input or output
|
|
by
|
|
.I open
|
|
or
|
|
.I create
|
|
(see
|
|
.IR open (3)).
|
|
These calls return an integer called a
|
|
.IR "file descriptor"
|
|
which identifies the file
|
|
to subsequent I/O calls,
|
|
notably
|
|
.IR read (3)
|
|
and
|
|
.IR write .
|
|
The system allocates the numbers by selecting the lowest unused descriptor.
|
|
They are allocated dynamically; there is no visible limit to the number of file
|
|
descriptors a process may have open.
|
|
They may be reassigned using
|
|
.IR dup (3).
|
|
File descriptors are indices into a
|
|
kernel resident
|
|
.IR "file descriptor table" .
|
|
Each process has an associated file descriptor table.
|
|
In threaded programs
|
|
(see
|
|
.IR thread (3)),
|
|
the file descriptor table is shared by all the procs.
|
|
.PP
|
|
By convention,
|
|
file descriptor 0 is the standard input,
|
|
1 is the standard output,
|
|
and 2 is the standard error output.
|
|
With one exception, the operating system is unaware of these conventions;
|
|
it is permissible to close file 0,
|
|
or even to replace it by a file open only for writing,
|
|
but many programs will be confused by such chicanery.
|
|
The exception is that the system prints messages about broken processes
|
|
to file descriptor 2.
|
|
.PP
|
|
Files are normally read or written in sequential order.
|
|
The I/O position in the file is called the
|
|
.IR "file offset"
|
|
and may be set arbitrarily using the
|
|
.IR seek (3)
|
|
system call.
|
|
.PP
|
|
Directories may be opened like regular files.
|
|
Instead of reading them with
|
|
.IR read (3),
|
|
use the
|
|
.B Dir
|
|
structure-based
|
|
routines described in
|
|
.IR dirread (3).
|
|
The entry
|
|
corresponding to an arbitrary file can be retrieved by
|
|
.IR dirstat
|
|
(see
|
|
.IR stat (3))
|
|
or
|
|
.IR dirfstat ;
|
|
.I dirwstat
|
|
and
|
|
.I dirfwstat
|
|
write back entries, thus changing the properties of a file.
|
|
.PP
|
|
New files are made with
|
|
.I create
|
|
(see
|
|
.IR open (3))
|
|
and deleted with
|
|
.IR remove (3).
|
|
Directories may not directly be written;
|
|
.IR create ,
|
|
.IR remove ,
|
|
.IR wstat ,
|
|
and
|
|
.I fwstat
|
|
alter them.
|
|
.PP
|
|
.IR Pipe (3)
|
|
creates a connected pair of file descriptors,
|
|
useful for bidirectional local communication.
|
|
.SS "Process execution and control"
|
|
A new process is created
|
|
when an existing one calls
|
|
.IR fork (2).
|
|
The new (child) process starts out with
|
|
copies of the address space and most other attributes
|
|
of the old (parent) process.
|
|
In particular,
|
|
the child starts out running
|
|
the same program as the parent;
|
|
.IR exec (3)
|
|
will bring in a different one.
|
|
.PP
|
|
Each process has a unique integer process id;
|
|
a set of open files, indexed by file descriptor;
|
|
and a current working directory
|
|
(changed by
|
|
.IR chdir (2)).
|
|
.PP
|
|
Each process has a set of attributes \(em memory, open files,
|
|
name space, etc. \(em that may be shared or unique.
|
|
Flags to
|
|
.IR rfork
|
|
control the sharing of these attributes.
|
|
.PP
|
|
A process terminates by calling
|
|
.IR exits (3).
|
|
A parent process may call
|
|
.IR wait (3)
|
|
to wait for some child to terminate.
|
|
A bit of status information
|
|
may be passed from
|
|
.I exits
|
|
to
|
|
.IR wait .
|
|
On Plan 9, the status information is an arbitrary text string,
|
|
but on Unix it is a single integer.
|
|
The Plan 9 interface persists here, although the functionality does not.
|
|
Instead, empty strings are converted to exit status 0 and non-empty strings to 1.
|
|
.PP
|
|
A process can go to sleep for a specified time by calling
|
|
.IR sleep (3).
|
|
.PP
|
|
There is a
|
|
.I notification
|
|
mechanism for telling a process about events such as address faults,
|
|
floating point faults, and messages from other processes.
|
|
A process uses
|
|
.IR notify (3)
|
|
to register the function to be called (the
|
|
.IR "notification handler" )
|
|
when such events occur.
|
|
.SS Multithreading
|
|
Where possible according to the ANSI C standard,
|
|
the main C library works properly in multiprocess programs;
|
|
.IR malloc ,
|
|
.IR print ,
|
|
and the other routines use locks (see
|
|
.IR lock (3))
|
|
to synchronize access to their data structures.
|
|
The graphics library defined in
|
|
.B <draw.h>
|
|
is also multi-process capable; details are in
|
|
.IR graphics (3).
|
|
In general, though, multiprocess programs should use some form of synchronization
|
|
to protect shared data.
|
|
.PP
|
|
The thread library, defined in
|
|
.BR <thread.h> ,
|
|
provides support for multiprocess programs.
|
|
It includes a data structure called a
|
|
.B Channel
|
|
that can be used to send messages between processes,
|
|
and coroutine-like
|
|
.IR threads ,
|
|
which enable multiple threads of control within a single process.
|
|
The threads within a process are scheduled by the library, but there is
|
|
no pre-emptive scheduling within a process; thread switching occurs
|
|
only at communication or synchronization points.
|
|
.PP
|
|
Most programs using the thread library
|
|
comprise multiple processes
|
|
communicating over channels, and within some processes,
|
|
multiple threads. Since I/O calls may block, a system
|
|
call may block all the threads in a process.
|
|
Therefore, a program that shouldn't block unexpectedly will use a process
|
|
to serve the I/O request, passing the result to the main processes
|
|
over a channel when the request completes.
|
|
For examples of this design, see
|
|
.IR ioproc (3)
|
|
or
|
|
.IR mouse (3).
|
|
.SH SEE ALSO
|
|
.IR nm (1),
|
|
.IR 9c (1)
|
|
.SH DIAGNOSTICS
|
|
Math functions in
|
|
.I libc
|
|
return
|
|
special values when the function is undefined for the
|
|
given arguments or when the value is not representable
|
|
(see
|
|
.IR nan (3)).
|
|
.PP
|
|
Some of the functions in
|
|
.I libc
|
|
are system calls and many others employ system calls in their implementation.
|
|
All system calls return integers,
|
|
with \-1 indicating that an error occurred;
|
|
.IR errstr (3)
|
|
recovers a string describing the error.
|
|
Some user-level library functions also use the
|
|
.I errstr
|
|
mechanism to report errors.
|
|
Functions that may affect the value of the error string are said to ``set
|
|
.IR errstr '';
|
|
it is understood that the error string is altered only if an error occurs.
|