Subversion Repositories planix.SVN

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
.TH INTRO 2
2
.SH NAME
3
intro \- introduction to library functions
4
.SH SYNOPSIS
5
.nf
6
.B #include <u.h>
7
.PP
8
.B #include <libc.h>
9
.PP
10
.B #include <auth.h>
11
.PP
12
.B #include <bio.h>
13
.PP
14
.B #include <draw.h>
15
.PP
16
.B #include <fcall.h>
17
.PP
18
.B #include <frame.h>
19
.PP
20
.B #include <mach.h>
21
.PP
22
.B #include <ndb.h>
23
.PP
24
.B #include <regexp.h>
25
.PP
26
.B #include <stdio.h>
27
.PP
28
.B #include <thread.h>
29
.fi
30
.SH DESCRIPTION
31
This section describes functions
32
in various libraries.
33
For the most part, each library is defined by a single C include
34
file, such as those listed above, and a single archive file containing
35
the library proper.  The name of the archive is
36
.BI /$objtype/lib/lib x .a \f1,
37
where
38
.I x
39
is the base of the include file name, stripped of a leading
40
.B lib
41
if present.
42
For example,
43
.B <draw.h>
44
defines the contents of library
45
.BR /$objtype/lib/libdraw.a ,
46
which may be abbreviated when named to the loader as
47
.BR -ldraw .
48
In practice, each include file contains a
49
.B #pragma
50
that directs the loader to pick up the associated archive
51
automatically, so it is rarely necessary to tell the loader
52
which
53
libraries a program needs.
54
.PP
55
The library to which a function belongs is defined by the
56
header file that defines its interface.
57
The `C library',
58
.IR libc ,
59
contains most of the basic subroutines such
60
as
61
.IR strlen .
62
Declarations for all of these functions are
63
in
64
.BR <libc.h> ,
65
which must be preceded by
66
.RI ( needs )
67
an include of
68
.BR <u.h> .
69
The graphics library,
70
.IR draw ,
71
is defined by
72
.BR <draw.h> ,
73
which needs
74
.B <libc.h>
75
and
76
.BR <u.h> .
77
The Buffered I/O library,
78
.IR libbio ,
79
is defined by
80
.BR <bio.h> ,
81
which needs
82
.B <libc.h>
83
and
84
.BR <u.h> .
85
The ANSI C Standard I/O library,
86
.IR libstdio ,
87
is defined by
88
.BR <stdio.h> ,
89
which needs
90
.BR <u.h> .
91
There are a few other, less commonly used libraries defined on
92
individual pages of this section.
93
.PP
94
The include file
95
.BR <u.h> ,
96
a prerequisite of several other include files,
97
declares the architecture-dependent and -independent types, including:
98
.IR uchar ,
99
.IR ushort ,
100
.IR uint ,
101
and
102
.IR ulong ,
103
the unsigned integer types;
104
.IR schar ,
105
the signed char type;
106
.I vlong
107
and
108
.IR uvlong ,
109
the signed and unsigned very long integral types;
110
.IR Rune ,
111
the Unicode character type;
112
.IR u8int ,
113
.IR u16int ,
114
.IR u32int ,
115
and
116
.IR u64int ,
117
the unsigned integral types with specific widths;
118
.IR uintptr ,
119
the unsigned integral type with the same width as a pointer;
120
.IR jmp_buf ,
121
the type of the argument to
122
.I setjmp
123
and 
124
.IR longjmp ,
125
plus macros that define the layout of
126
.IR jmp_buf
127
(see
128
.IR setjmp (2));
129
definitions of the bits in the floating-point control register
130
as used by
131
.IR getfcr (2);
132
and
133
the macros
134
.B va_arg
135
and friends for accessing arguments of variadic functions (identical to the
136
macros defined in
137
.B <stdarg.h>
138
in ANSI C).
139
.SS "Name space
140
Files are collected into a hierarchical organization called a
141
.I "file tree
142
starting in a
143
.I directory
144
called the
145
.IR root .
146
File names, also called
147
.IR paths ,
148
consist of a number of
149
.BR / -separated
150
.I "path elements"
151
with the slashes corresponding to directories.
152
A path element must contain only printable
153
characters (those outside the control spaces of
154
.SM ASCII
155
and Latin-1).
156
A path element cannot contain a slash.
157
.PP
158
When a process presents a file name to Plan 9, it is
159
.I evaluated
160
by the following algorithm.
161
Start with a directory that depends on the first
162
character of the path:
163
.L /
164
means the root of the main hierarchy,
165
.L #
166
means the separate root of a kernel device's file tree (see Section 3),
167
and anything else means the process's current working directory.
168
Then for each path element, look up the element
169
in the directory, advance to that directory,
170
do a possible translation (see below), and repeat.
171
The last step may yield a directory or regular file.
172
The collection of files reachable from the root is called the
173
.I "name space
174
of a process.
175
.PP
176
A program can use
177
.I bind
178
or
179
.I mount
180
(see
181
.IR bind (2))
182
to say that whenever a specified file is reached during evaluation,
183
evaluation instead continues from a second specified file.
184
Also, the same system calls create
185
.IR "union directories" ,
186
which are concatenations of ordinary directories
187
that are searched sequentially until the desired element is found.
188
Using
189
.I bind
190
and
191
.I mount
192
to do name space adjustment affects only
193
the current process group (see below).
194
Certain conventions about the layout of the name space should
195
be preserved; see
196
.IR namespace (4).
197
.SS "File I/O"
198
Files are opened for input or output
199
by
200
.I open
201
or
202
.I create
203
(see
204
.IR open (2)).
205
These calls return an integer called a
206
.IR "file descriptor"
207
which identifies the file
208
to subsequent I/O calls,
209
notably
210
.IR read (2)
211
and
212
.IR write .
213
The system allocates the numbers by selecting the lowest unused descriptor.
214
They are allocated dynamically; there is no visible limit to the number of file
215
descriptors a process may have open.
216
They may be reassigned using
217
.IR dup (2).
218
File descriptors are indices into a
219
kernel resident
220
.IR "file descriptor table" .
221
Each process has an associated file descriptor table.
222
In some cases (see
223
.I rfork
224
in
225
.IR fork (2))
226
a file descriptor table may be shared by several processes.
227
.PP
228
By convention,
229
file descriptor 0 is the standard input,
230
1 is the standard output,
231
and 2 is the standard error output.
232
With one exception, the operating system is unaware of these conventions;
233
it is permissible to close file 0,
234
or even to replace it by a file open only for writing,
235
but many programs will be confused by such chicanery.
236
The exception is that the system prints messages about broken processes
237
to file descriptor 2.
238
.PP
239
Files are normally read or written in sequential order.
240
The I/O position in the file is called the
241
.IR "file offset"
242
and may be set arbitrarily using the
243
.IR seek (2)
244
system call.
245
.PP
246
Directories may be opened and read much like regular files.
247
They contain an integral number of records, called
248
.IR "directory entries" .
249
Each entry is a machine-independent representation of
250
the information about an existing file in the directory,
251
including the name, ownership,
252
permission,
253
access dates,
254
and so on.
255
The entry
256
corresponding to an arbitrary file can be retrieved by
257
.IR stat (2)
258
or
259
.IR fstat ;
260
.I wstat
261
and
262
.I fwstat
263
write back entries, thus changing the properties of a file.
264
An entry may be translated into a more convenient, addressable
265
form called a
266
.B Dir
267
structure;
268
.IR dirstat ,
269
.IR dirfstat,
270
.IR dirwstat ,
271
and
272
.I dirfwstat
273
execute the appropriate translations (see
274
.IR stat (2)).
275
.PP
276
New files are made with
277
.I create
278
(see
279
.IR open (2))
280
and deleted with
281
.IR remove (2).
282
Directories may not directly be written;
283
.IR create ,
284
.IR remove ,
285
.IR wstat ,
286
and
287
.I fwstat
288
alter them.
289
.PP
290
The operating system kernel records the file name used to access each open file or directory.
291
If the file is opened by a local name (one that does not begin
292
.B /
293
or
294
.BR # ),
295
the system makes the stored name absolute by prefixing
296
the string associated with the current directory.
297
Similar lexical adjustments are made for path names containing
298
.B .
299
(dot) or
300
.B ..
301
(dot-dot).
302
By this process, the system maintains a record of the route by which each file was accessed.
303
Although there is a possibility for error\(emthe name is not maintained after the file is opened,
304
so removals and renamings can confound it\(emthis simple method usually
305
permits the system to return, via the
306
.IR fd2path (2)
307
system call and related calls such as
308
.IR getwd (2),
309
a valid name that may be used to find a file again.
310
This is also the source of the names reported in the name space listing of
311
.IR ns (1)
312
or
313
.B /dev/ns
314
(see
315
.IR proc (3)).
316
.PP
317
.IR Pipe (2)
318
creates a connected pair of file descriptors,
319
useful for bidirectional local communication.
320
.SS "Process execution and control"
321
A new process is created
322
when an existing one calls
323
.I rfork
324
with the
325
.B RFPROC
326
bit set, usually just by calling
327
.IR fork (2).
328
The new (child) process starts out with
329
copies of the address space and most other attributes
330
of the old (parent) process.
331
In particular,
332
the child starts out running
333
the same program as the parent;
334
.IR exec (2)
335
will bring in a different one.
336
.PP
337
Each process has a unique integer process id;
338
a set of open files, indexed by file descriptor;
339
and a current working directory
340
(changed by
341
.IR chdir (2)).
342
.PP
343
Each process has a set of attributes \(em memory, open files,
344
name space, etc. \(em that may be shared or unique.
345
Flags to
346
.IR rfork
347
control the sharing of these attributes.
348
.PP
349
The memory of a process is divided into
350
.IR segments .
351
Every program has at least a
352
.I text
353
(instruction) and
354
.I stack
355
segment.
356
Most also have an initialized
357
.I data
358
segment and a segment of zero-filled data called
359
.IR bss .
360
Processes may
361
.IR segattach (2)
362
other segments for special purposes.
363
.PP
364
A process terminates by calling
365
.IR exits (2).
366
A parent process may call
367
.IR wait (2)
368
to wait for some child to terminate.
369
A string of status information
370
may be passed from
371
.I exits
372
to
373
.IR wait .
374
A process can go to sleep for a specified time by calling
375
.IR sleep (2).
376
.PP
377
There is a
378
.I notification
379
mechanism for telling a process about events such as address faults,
380
floating point faults, and messages from other processes.
381
A process uses
382
.IR notify (2)
383
to register the function to be called (the
384
.IR "notification handler" )
385
when such events occur.
386
.SS Multithreading
387
By calling
388
.I rfork
389
with the
390
.B RFMEM
391
bit set, a program may create several independently executing processes sharing the same
392
memory (except for the stack segment, which is unique to each process).
393
Where possible according to the ANSI C standard,
394
the main C library works properly in multiprocess programs;
395
.IR malloc ,
396
.IR print ,
397
and the other routines use locks (see
398
.IR lock (2))
399
to synchronize access to their data structures.
400
The graphics library defined in
401
.B <draw.h>
402
is also multi-process capable; details are in
403
.IR graphics (2).
404
In general, though, multiprocess programs should use some form of synchronization
405
to protect shared data.
406
.PP
407
The thread library, defined in
408
.BR <thread.h> ,
409
provides support for multiprocess programs.
410
It includes a data structure called a
411
.B Channel
412
that can be used to send messages between processes,
413
and coroutine-like
414
.IR threads ,
415
which enable multiple threads of control within a single process.
416
The threads within a process are scheduled by the library, but there is
417
no pre-emptive scheduling within a process; thread switching occurs
418
only at communication or synchronization points.
419
.PP
420
Most programs using the thread library
421
comprise multiple processes
422
communicating over channels, and within some processes,
423
multiple threads.  Since Plan 9 I/O calls may block, a system
424
call may block all the threads in a process.
425
Therefore, a program that shouldn't block unexpectedly will use a process
426
to serve the I/O request, passing the result to the main processes
427
over a channel when the request completes.
428
For examples of this design, see
429
.IR ioproc (2)
430
or
431
.IR mouse (2).
432
.SH SEE ALSO
433
.IR nm (1), 
434
.IR 8l (1), 
435
.IR 8c (1)
436
.SH DIAGNOSTICS
437
Math functions in
438
.I libc
439
return
440
special values when the function is undefined for the
441
given arguments or when the value is not representable
442
(see
443
.IR nan (2)).
444
.PP
445
Some of the functions in
446
.I libc
447
are system calls and many others employ system calls in their implementation.
448
All system calls return integers,
449
with \-1 indicating that an error occurred;
450
.IR errstr (2)
451
recovers a string describing the error.
452
Some user-level library functions also use the
453
.I errstr
454
mechanism to report errors.
455
Functions that may affect the value of the error string are said to ``set
456
.IR errstr '';
457
it is understood that the error string is altered only if an error occurs.