|HP-UX Reference > V
HP-UX 11i Version 3: February 2007
vfork — spawn new process; share virtual memory
vfork() is a higher performance version of fork() that is provided on some systems where a performance 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() implementation is as efficient as possible. Other versions may do the same to avoid the overhead of supporting two similar calls.
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.
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 process is created, and errno is set to indicate the error.
vfork() fails and no child process is created if any of the following conditions are encountered:
Process times for the parent and child processes within the [vfork,exec] window may be inaccurate.