A newly spawned Limbo process (also known as a thread)
shares with its parent process a number of resources and properties,
such as file name space, open file descriptors, current working directory,
and so on.
Pctl
controls this sharing, allowing a process to gain a copy of a resource
rather than to share it, to start with a null resource, and so on.
The set of processes sharing a property are called a group;
for example the set of processes sharing a name space are called a name space group.
Each process is a member of a
process group,
typically the set of threads functioning as a single program.
All the members of a process group
may be terminated at once using the
killgrp
control message in the
prog(3)
device.
A call to
pctl
affects the calling process and, indirectly according to
flags,
any other processes sharing properties with it.
The
flags
to
pctl
are:
- NEWFD
- Give the process a new file descriptor group.
All file descriptors are closed except those listed in
movefd,
which are preserved in the new group.
After this call, changes the process makes to its set of open file descriptors
will not be visible to other processes.
- FORKFD
- Place the process in a new file descriptor group
containing a copy
of the current set of file descriptors.
The file descriptors listed in
movefd
are closed in the
old
group.
After this call, changes the process makes to its set of open file descriptors
will not be visible to other processes.
- NEWNS
- Place the process in a new file name space group in which the current directory
is made the root directory,
/,
of the new name space.
The current directory is unaffected by this call.
- FORKNS
- Place the process in a new file name space group
containing a copy
of the current name space.
After this call, changes the process makes to its name space, including
chdir
calls,
will not affect other processes.
- NODEVS
- Set the current file name space group to prevent subsequent access to
the roots of file trees implemented by a device driver (ie, the use of path
names beginning with
#,
as described by
intro(3)).
Even after
NODEVS
the following devices can be attached, which are either
private or can be separately controlled:
pipe(3),
env(3),
srv(3)
and
ssl(3).
- NEWENV
- Place the process in a new empty environment group containing
no environment variables.
After this call, changes the process makes to its environment will
not affect other processes.
- FORKENV
- Place the process in a new environment group containing
a copy of the current environment variables.
After this call, changes the process makes to its environment will
not affect other processes.
- NEWPGRP
- Establish a new process group with a group id equal to that of the pid
of the calling process.
The Inferno shell
sh(1)
uses
FORKFD
when starting a command;
its
pctl
built-in (see
sh-std(1))
can invoke the other effects when needed.
The window manager
wm(1)
uses
NEWPGRP|FORKFD
when starting a window manager application.
A network server might use
NEWPGRP|FORKNS|FORKFD|FORKENV
to insulate itself completely from services it starts.
The return value of
pctl
is the numerical process id of the calling process, which can be used for example to
access its
prog(3)
files.