HP-UX Reference (11i v3 07/02) - 2 System Calls (vol 5)

v
vfork(2) vfork(2)
NAME
vfork - spawn new process; share virtual memory
SYNOPSIS
#include <unistd.h>
pid_t vfork(void);
REMARKS
vfork() is a higher performance version of fork()
that is provided on some systems where a perfor-
mance advantage can be attained.
If the calling process is multi-threaded, the newly created child process will only contain one thread. This
one thread will be a copy of the thread calling
vfork().
vfork() differs from fork() only in that the child process can share code and data with the calling
process (parent process). This speeds cloning activity significantly at a risk to the integrity of the parent
process if
vfork() is misused.
The use of vfork() for any purpose except as a prelude to an immediate exec() or _exit()
is not
supported. Any program that relies upon the differences between
fork() and vfork() is not portable
across HP-UX systems.
All HP-UX implementations must provide the entry
vfork(), but it is permissible for them to treat it
identically to
fork. On some implementations the two are not distinguished because the
fork() imple-
mentation is as efficient as possible. Other versions may do the same to avoid the overhead of supporting
two similar calls.
DESCRIPTION
vfork() can be used to create new processes without fully copying the address space of the old process.
If a forked process is simply going to do an exec() (see exec(2)), the data space copied from the parent to
the child by fork() is not used. This is particularly inefficient in a paged environment, making
vfork
particularly useful. Depending upon the size of the parent’s data space, vfork() can give a significant
performance improvement over fork().
vfork() differs from fork() in that the child borrows the parent’s memory and thread of control until
a call to exec() or an exit (either by a call to _exit() or abnormally (see exec(2) and exit(2)). The
parent process is suspended while the child is using its resources.
vfork() returns 0 in the child’s context and (later) the pid of the child in the parent’s context.
vfork() can normally be used just like fork(). It does not work, however, to return while running in
the child’s context from the procedure which called vfork() since the eventual return from vfork()
would then return to a no longer existent stack frame.
The [vfork,exec] window begins at the vfork() call and ends when the child completes its
exec()
call.
RETURN VALUE
Upon successful completion, vfork() 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, no child pro-
cess is created, and errno is set to indicate the error.
ERRORS
vfork() fails and no child process is created if any of the following conditions are encountered:
[EAGAIN] The system-wide limit on the total number of processes under execution would be
exceeded.
[EAGAIN] The system-imposed limit on the total number of processes under execution by a sin-
gle user would be exceeded.
DEPENDENCIES
Servers
Process times for the parent and child processes within the [vfork,exec] window may be inaccurate.
Parent and child processes share the same stack space within the [vfork,exec] window. If the size
of the stack has been changed within this window by the child process (return from or call to a
HP-UX 11i Version 3: February 2007 1 Hewlett-Packard Company 537