quick question: what’s the difference between fork() and vfork() system calls ?
quick answer: vfork() system call creates a process that shares the memory address space of its parent.
fork() is implemented by linux as a clone() system call whose flags parameter specifies both a SIGCHLD signal and all the clone flags cleared and whose child_stack parameter is 0.
vfork() is implemented by linux as a clone() system call whose flags parameter specifies both a SGCHLD signal and flags CLONE_VM and CLONE_VFORK and whose second parameter is 0.
[ discussion: copy on write ]
This is a concept of making the process creation using fork() efficient in that instead of copying the parent’s address space while process creation, it is shared but as soon as either of them write on the page, kernel allocates a new page and assigns it to the writer process.
Most of the time, forking is required just to run a new process in which case it’s a waste to copy the whole parent address space.
Some systems have a system call
vfork(), which was originally
designed as a lower-overhead version of
fork() involved copying the entire address space of the process,
and was therefore quite expensive, the
vfork() function was
introduced (in 3.0BSD).
vfork() was introduced, the
fork() has improved drastically, most notably
with the introduction of `copy-on-write', where the copying of the
process address space is transparently faked by allowing both processes
to refer to the same physical memory until either of them modify
it. This largely removes the justification for
vfork(); indeed, a
large proportion of systems now lack the original functionality of
vfork() completely. For compatibility, though, there may still be
vfork() call present, that simply calls
attempting to emulate all of the
As a result, it is very unwise to actually make use of any of the
vfork(). Indeed, it is
probably unwise to use
vfork() at all, unless you know exactly
why you want to.
The basic difference between the two is that when a new process is
vfork(), the parent process is temporarily
suspended, and the child process might borrow the parent's address
space. This strange state of affairs continues until the child process
either exits, or calls
execve(), at which point the parent
This means that the child process of a
vfork() must be careful to
avoid unexpectedly modifying variables of the parent process. In
particular, the child process must not return from the function
vfork() call, and it must not call
exit() (if it needs to exit, it should use
actually, this is also true for the child of a normal
During the fork() system call the Kernel makes a copy of the parent process�s address space and attaches it to the child process.But the vfork() system call do not makes any copy of the parent�s address space, so it is faster than the fork() system call. The child process as a result of the vfork() system call executes exec() system call. The child process from vfork() system call executes in the parent�s address space (this can overwrite the parent�s data and stack ) which suspends the parent process until the child process exits.
During the fork() system call the Kernel makes a copy of the parent process’s address space and attaches it to the child process.
But the vfork() system call do not makes any copy of the parent’s address space, so it is faster than the fork() system call. The child process as a result of the vfork() system call executes exec() system call. The child process from vfork() system call executes in the parent’s address space (this can overwrite the parent’s data and stack ) which suspends the parent process until the child process exits.