vfork - phpMan

Command: man perldoc info search(apropos)  


VFORK(2)                   Linux Programmer's Manual                  VFORK(2)



NAME
       vfork - create a child process and block parent

SYNOPSIS
       #include <sys/types.h>
       #include <unistd.h>

       pid_t vfork(void);

STANDARD DESCRIPTION
       (From  SUSv2  /  POSIX draft.)  The vfork() function has the same effect as fork(),
       except that the behaviour is undefined if the process  created  by  vfork()  either
       modifies  any  data  other  than  a variable of type pid_t used to store the return
       value from vfork(), or returns from the function in which vfork()  was  called,  or
       calls  any  other function before successfully calling _exit() or one of the exec()
       family of functions.

LINUX DESCRIPTION
       vfork(), just like fork(2), creates a child process of the  calling  process.   For
       details and return value and errors, see fork(2).

       vfork()  is a special case of clone(2).  It is used to create new processes without
       copying the page tables of the parent process.  It may  be  useful  in  performance
       sensitive  applications where a child will be created which then immediately issues
       an execve().

       vfork() differs from fork() in that the parent is suspended until the child makes a
       call  to  execve(2)  or  _exit(2).   The  child  shares all memory with its parent,
       including the stack, until execve() is issued by the child.   The  child  must  not
       return from the current function or call exit(), but may call _exit().

       Signal  handlers are inherited, but not shared.  Signals to the parent arrive after
       the child releases the parent's memory.

HISTORIC DESCRIPTION
       Under Linux, fork() is implemented using copy-on-write pages, so the  only  penalty
       incurred  by  fork() is the time and memory required to duplicate the parent's page
       tables, and to create a unique task structure for the child.  However, in  the  bad
       old  days a fork() would require making a complete copy of the caller's data space,
       often needlessly, since usually immediately afterwards an exec() is done. Thus, for
       greater efficiency, BSD introduced the vfork() system call, that did not fully copy
       the address space of the parent process,  but  borrowed  the  parent's  memory  and
       thread  of control until a call to execve() or an exit occurred. The parent process
       was suspended while the child was using its resources.   The  use  of  vfork()  was
       tricky:  for  example, not modifying data in the parent process depended on knowing
       which variables are held in a register.

BUGS
       It is rather unfortunate that Linux revived this spectre from the  past.   The  BSD
       manpage  states:  "This  system  call will be eliminated when proper system sharing
       mechanisms are implemented. Users should not depend on the memory sharing semantics
       of vfork() as it will, in that case, be made synonymous to fork()."

       Formally  speaking,  the standard description given above does not allow one to use
       vfork() since a following exec() might fail, and then what happens is undefined.

       Details of the signal handling are obscure and differ  between  systems.   The  BSD
       manpage  states:  "To avoid a possible deadlock situation, processes that are chil-
       dren in the middle of a vfork() are never sent SIGTTOU or SIGTTIN signals;  rather,
       output  or  ioctls  are allowed and input attempts result in an end-of-file indica-
       tion."

       Currently (Linux 2.3.25), strace(1) cannot follow vfork()  and  requires  a  kernel
       patch.

HISTORY
       The  vfork()  system  call appeared in 3.0BSD.  In 4.4BSD it was made synonymous to
       fork() but NetBSD introduced it again, cf. http://www.netbsd.org/Documentation/ker-
       nel/vfork.html  .   In  Linux, it has been equivalent to fork() until 2.2.0-pre6 or
       so. Since 2.2.0-pre9 (on i386, somewhat later on  other  architectures)  it  is  an
       independent system call. Support was added in glibc 2.0.112.

CONFORMING TO
       4.3BSD, POSIX.1-2001.

       The  requirements  put  on  vfork()  by  the standards are weaker than those put on
       fork(), so an implementation where the two are synonymous is compliant. In particu-
       lar,  the  programmer  cannot  rely on the parent remaining blocked until a call of
       execve() or _exit() and cannot rely on any specific behaviour w.r.t. shared memory.

SEE ALSO
       clone(2), execve(2), fork(2), unshare(2), wait(2)



Linux 2.2.0                       1999-11-01                          VFORK(2)

Generated by $Id: phpMan.php,v 4.49 2006/02/26 13:18:18 chedong Exp $ Author: Che Dong
On Apache/1.3.37 (Unix) mod_throttle/3.1.2 FrontPage/5.0.2.2635 mod_psoft_traffic/0.2 mod_ssl/2.8.28 OpenSSL/0.9.8b
Under GNU General Public License
2009-01-07 20:26 @38.103.63.55 Crawled by CCBot/1.0 (+http://www.commoncrawl.org/bot.html)
Valid XHTML 1.0!Valid CSS!