175 lines
4.7 KiB
Groff
175 lines
4.7 KiB
Groff
.\"
|
|
.\" This manual page is taken directly from Plan9, and modified to
|
|
.\" describe the actual BSD implementation. Permission for
|
|
.\" use of this page comes from Rob Pike <rob@plan9.att.com>.
|
|
.\"
|
|
.\" $FreeBSD$
|
|
.\"
|
|
.Dd Jan 12, 1996
|
|
.Dt RFORK 2
|
|
.Os
|
|
.Sh NAME
|
|
.Nm rfork
|
|
.Nd manipulate process resources
|
|
.Sh LIBRARY
|
|
.Lb libc
|
|
.Sh SYNOPSIS
|
|
.Fd #include <unistd.h>
|
|
.Ft int
|
|
.Fn rfork "int flags"
|
|
.Sh DESCRIPTION
|
|
Forking, vforking or rforking are the only ways new processes are created.
|
|
The
|
|
.Fa flags
|
|
argument to
|
|
.Fn rfork
|
|
selects which resources of the
|
|
invoking process (parent) are shared
|
|
by the new process (child) or initialized to
|
|
their default values.
|
|
The resources include
|
|
the open file descriptor table (which, when shared, permits processes
|
|
to open and close files for other processes),
|
|
and open files.
|
|
.Fa Flags
|
|
is the logical OR of some subset of:
|
|
.Bl -tag -width "RFCNAMEG" -compact -offset indent
|
|
.It RFPROC
|
|
If set a new process is created; otherwise changes affect the
|
|
current process.
|
|
The current implementation requires this flag to always be set.
|
|
.It RFNOWAIT
|
|
If set, the child process will be dissociated from the parent.
|
|
Upon
|
|
exit the child will not leave a status for the parent to collect.
|
|
See
|
|
.Xr wait 2 .
|
|
.It RFFDG
|
|
If set, the invoker's file descriptor table (see
|
|
.Xr intro 2
|
|
) is copied; otherwise the two processes share a
|
|
single table.
|
|
.It RFCFDG
|
|
If set, the new process starts with a clean file descriptor table.
|
|
Is mutually exclusive with
|
|
.Dv RFFDG .
|
|
.It RFMEM
|
|
If set, the kernel will force sharing of the entire address space,
|
|
typically by sharing the hardawre page table directly.
|
|
The child
|
|
will thus inherit and share all the segments the parent process owns,
|
|
whether they are normally shareable or not. The stack segment is
|
|
not split (both the parent and child return on the same stack) and thus
|
|
.Fn rfork
|
|
with the RFMEM flag may not generally be called directly from high level
|
|
languages including C.
|
|
May be set only with
|
|
.Dv RFPROC .
|
|
A helper function is provided to assist with this problem and will cause
|
|
the new process to run on the provided stack. See
|
|
.Fn rfork_thread 3
|
|
for information.
|
|
.It RFSIGSHARE
|
|
If set, the kernel will force sharing the sigacts structure between the
|
|
child and the parent.
|
|
.It RFLINUXTHPN
|
|
If set, the kernel will return SIGUSR1 instead of SIGCHILD upon thread
|
|
exit for the child. This is intended to mimic certain Linux clone behaviour.
|
|
.El
|
|
.Pp
|
|
File descriptors in a shared file descriptor table are kept
|
|
open until either they are explicitly closed
|
|
or all processes sharing the table exit.
|
|
.Pp
|
|
If
|
|
.Dv RFPROC
|
|
is set, the
|
|
value returned in the parent process
|
|
is the process id
|
|
of the child process; the value returned in the child is zero.
|
|
Without
|
|
.Dv RFPROC ,
|
|
the return value is zero.
|
|
Process id's range from 1 to the maximum integer
|
|
.Ft ( int )
|
|
value.
|
|
.Fn Rfork
|
|
will sleep, if necessary, until required process resources are available.
|
|
.Pp
|
|
.Fn Fork
|
|
can be implemented as a call to
|
|
.Fn rfork "RFFDG | RFPROC"
|
|
but isn't for backwards compatibility.
|
|
.Sh RETURN VALUES
|
|
Upon successful completion,
|
|
.Fn rfork
|
|
returns a value
|
|
of 0 to the child process and returns the process ID of the child
|
|
process to the parent process. Otherwise, a value of -1 is returned
|
|
to the parent process, no child process is created, and the global
|
|
variable
|
|
.Va errno
|
|
is set to indicate the error.
|
|
.Sh ERRORS
|
|
.Fn Rfork
|
|
will fail and no child process will be created if:
|
|
.Bl -tag -width Er
|
|
.It Bq Er EAGAIN
|
|
The system-imposed limit on the total
|
|
number of processes under execution would be exceeded.
|
|
The limit is given by the
|
|
.Xr sysctl 3
|
|
MIB variable
|
|
.Dv KERN_MAXPROC .
|
|
(The limit is actually one less than this
|
|
except for the super user).
|
|
.It Bq Er EAGAIN
|
|
The user is not the super user, and
|
|
the system-imposed limit
|
|
on the total number of
|
|
processes under execution by a single user would be exceeded.
|
|
The limit is given by the
|
|
.Xr sysctl 3
|
|
MIB variable
|
|
.Dv KERN_MAXPROCPERUID .
|
|
.It Bq Er EAGAIN
|
|
The user is not the super user, and
|
|
the soft resource limit corresponding to the resource parameter
|
|
.Dv RLIMIT_NOFILE
|
|
would be exceeded (see
|
|
.Xr getrlimit 2 ) .
|
|
.It Bq Er EINVAL
|
|
The RFPROC flag was not specified.
|
|
.It Bq Er EINVAL
|
|
Both the RFFDG and the RFCFDG flags were specified.
|
|
.It Bq Er ENOMEM
|
|
There is insufficient swap space for the new process.
|
|
.El
|
|
.Sh SEE ALSO
|
|
.Xr fork 2 ,
|
|
.Xr intro 2 ,
|
|
.Xr minherit 2 ,
|
|
.Xr vfork 2 ,
|
|
.Xr rfork_thread 3
|
|
.Sh BUGS
|
|
.Fx
|
|
does not yet implement a native
|
|
.Fn clone
|
|
library call, and the current pthreads implementation does not use
|
|
.Fn
|
|
rfork
|
|
with RFMEM. A native port of the linux threads library,
|
|
.Pa /usr/ports/devel/linuxthreads ,
|
|
contains a working
|
|
.Fn
|
|
clone
|
|
call that utilizes RFMEM.
|
|
The
|
|
.Fn rfork_thread
|
|
library call can often be used instead of
|
|
.Fn clone .
|
|
.Sh HISTORY
|
|
The
|
|
.Fn rfork
|
|
function call first appeared in Plan9.
|