1996-02-23 19:56:55 +00:00
|
|
|
.\"
|
|
|
|
.\" 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>.
|
|
|
|
.\"
|
|
|
|
.Dd Jan 12, 1996
|
|
|
|
.Dt RFORK 2
|
|
|
|
.Os
|
|
|
|
.Sh NAME
|
|
|
|
.Nm rfork
|
|
|
|
.Nd manipulate process resources
|
|
|
|
.Sh SYNOPSIS
|
|
|
|
.Fd #include <unistd.h>
|
|
|
|
.Ft int
|
|
|
|
.Fn rfork "int flags"
|
|
|
|
.Sh DESCRIPTION
|
1997-01-12 00:38:36 +00:00
|
|
|
Forking, vforking or rforking are the only ways new processes are created.
|
1996-02-23 19:56:55 +00:00
|
|
|
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
|
1997-01-12 00:38:36 +00:00
|
|
|
is the logical OR of some subset of:
|
1996-02-23 19:56:55 +00:00
|
|
|
.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.
|
|
|
|
The child
|
|
|
|
will then inherit all the shared segments the parent process owns. Other segment
|
|
|
|
types will be unaffected. Subsequent forks by the parent will then
|
|
|
|
propagate the shared data and bss between children. The stack segment
|
|
|
|
is always split. May be set only with
|
|
|
|
.Dv RFPROC .
|
|
|
|
.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
|
1996-03-27 20:49:07 +00:00
|
|
|
.Fn rfork "RFFDG|RFPROC"
|
1996-02-23 19:56:55 +00:00
|
|
|
but isn't for backwards compatibility.
|
1997-01-12 00:38:36 +00:00
|
|
|
.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.
|
1996-02-23 19:56:55 +00:00
|
|
|
.Sh ERRORS
|
|
|
|
.Fn Rfork
|
|
|
|
will fail and no child process will be created if:
|
1996-09-29 17:47:46 +00:00
|
|
|
.Bl -tag -width [EAGAIN]
|
1996-02-23 19:56:55 +00:00
|
|
|
.It Bq Er EAGAIN
|
|
|
|
The system-imposed limit on the total
|
|
|
|
number of processes under execution would be exceeded.
|
1996-09-29 17:47:46 +00:00
|
|
|
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).
|
1996-02-23 19:56:55 +00:00
|
|
|
.It Bq Er EAGAIN
|
1996-09-29 17:47:46 +00:00
|
|
|
The user is not the super user, and
|
|
|
|
the system-imposed limit
|
1996-02-23 19:56:55 +00:00
|
|
|
on the total number of
|
|
|
|
processes under execution by a single user would be exceeded.
|
1996-09-29 17:47:46 +00:00
|
|
|
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 ) .
|
1996-04-18 23:36:41 +00:00
|
|
|
.It Bq Er EINVAL
|
|
|
|
The RFPROC flag was not specified.
|
|
|
|
.It Bq Er EINVAL
|
|
|
|
Both the RFFDG and the RFCFDG flags were specified.
|
1996-02-23 19:56:55 +00:00
|
|
|
.It Bq Er ENOMEM
|
|
|
|
There is insufficient swap space for the new process.
|
|
|
|
.El
|
|
|
|
.Sh SEE ALSO
|
|
|
|
.Xr fork 2 ,
|
1997-01-20 23:23:22 +00:00
|
|
|
.Xr intro 2 ,
|
|
|
|
.Xr minherit 2 ,
|
|
|
|
.Xr vfork 2
|
1996-02-23 19:56:55 +00:00
|
|
|
.Sh HISTORY
|
|
|
|
The
|
|
|
|
.Fn rfork
|
1996-04-18 23:36:41 +00:00
|
|
|
function call first appeared in Plan9.
|