vfork()
Ralf U. Holighaus
ralfi at pemcom.pem-stuttgart.de
Tue Mar 26 20:54:17 AEST 1991
pfalstad at phoenix.Princeton.EDU (Paul Falstad) writes:
>>Actually with vfork, the sun process shares text and data with the father
>>process, so the only thing possible after a vfork is either an exit by
>>the father or an exec by the son. Any other use will cause garbage, be-
>>cause neither of the two processes has a data rang for it's own.
>Not true. The parent cannot exit because it's not running; it waits for the
>child to exit or exec first. The child can do whatever it wants to the
>parent's data segment before it exit()s or exec()s (except destroy the
>parent's stack frame) without causing garbage. You could even use this call
>for a horribly unportable shared memory hack if you wanted.
VFORK(2) HP-UX VFORK(2)
NAME
vfork - spawn new process in a virtual memory efficient way
SYNOPSIS
int vfork()
REMARKS
Vfork is provided as a higher performance version of fork on
those systems which choose to provide it and for which there
is a performance advantage.
Vfork differs from fork only in that the child process may
share code and data with the calling process (parent
process). This speeds the 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 which
relies upon the differences between fork and vfork is not
portable across HP-UX systems.
All implementations of HP-UX must provide the entry vfork,
but it is permissible for them to treat it identically to
fork. Some implementations may not choose to distinguish
the two because their implementation of fork is as efficient
as possible, and others may not wish to carry the added
overhead of 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(2), the data space
copied from the parent to the child by fork(2) is not used.
This is particularly inefficient in a paged environment.
Vfork is useful in this case. Depending upon the size of
the parent's data space, it 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(2) or abnormally.) The
parent process is suspended while the child is using its
resources.
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
Hewlett-Packard Company - 1 - Version B.1, Mar 10, 1989
VFORK(2) HP-UX VFORK(2)
from vfork would then return to a no longer existent stack
frame. Be careful, also, to call exit rather than exit if
you cannot exec, since exit will flush and close standard
I/O channels, and thereby mess up the parent process's
standard I/O data structures. (Even with fork it is wrong
to call exit since buffered data would then be flushed
twice.)
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 process is created, and
errno is set to indicate the error.
ERRORS
Vfork will fail and no child process will be created if one
or more of the following are true:
[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 single user
would be exceeded.
DEPENDENCIES
Series 300, 800
A call to signal(2) in the [vfork,exec] window which is
used to catch a signal can affect handling of the
signal by the parent. This is not true if the signal
is set SIGDFL or SIGIGN, or if sigvector(2) is used.
Series 500
Shared memory segments generated with the EMS
intrinsics will be inherited over vfork. Private memory
segments will not be copied over vfork.
Vfork will also fail in the following cases:
[ENOMEM] There is not enough physical memory to
create the new process.
[EAGAIN] The child process attempts to do a
second vfork or a fork while in the
[vfork,exec] window.
The parent and child processes share the same stack
Hewlett-Packard Company - 2 - Version B.1, Mar 10, 1989
VFORK(2) HP-UX VFORK(2)
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 function, for
example), it is likely that the parent and child
processes will be killed with signal SIGSEGV.
Series 500, 800
Process times for the parent and child processes within
the [vfork,exec] window may be inaccurate.
Series 800
The 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 function, for
example), it is likely that the parent and child
processes will be killed with signal SIGSEGV or SIGBUS.
AUTHOR
Vfork was developed by the University of California,
Berkeley.
SEE ALSO
exec(2), exit(2), fork(2), wait(2).
--
PEM Programmentwicklungsgesellschaft | Ralf U. Holighaus
fuer Microcomputer mbH | Technical Support
PO-Box 810165 D-7000 Stuttgart 80 Germany | holighaus at pemstgt.PEM-Stuttgart.de
VOICE: x49-711-713045 FAX: x49-711-713047 | ..!unido!pemcom!ralfi
More information about the Comp.unix.questions
mailing list