Provided by: manpages-es_1.55-10_all bug

NOMBRE

       vfork - crea un proceso hijo y bloquea al padre

SINOPSIS

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

       pid_t vfork(void);

DESCRIPCI'ON EST'ANDAR

       (Segun  XPG4  /  SUSv2  / borrador POSIX.)  La funcion vfork() tiene el
       mismo efecto que fork(), pero el comportamiento  es  indefinido  si  el
       proceso  creado  por vfork() o bien modifica cualquier otro dato que no
       sea una variable de tipo pid_t usada para almacenar el  valor  devuelto
       por  vfork(), o bien regresa de la funcion en la que se llamo a vfork()
       o bien llama a cualquier otra funcion  antes  de  llamar  con  exito  a
       _exit() o a una de las funciones de la familia exec.

ERRORES

       EAGAIN Demasiados procesos. Intentelo de nuevo.

       ENOMEM No hay espacio de intercambio suficiente para el nuevo proceso.

DESCRIPCI'ON DE LINUX

       vfork,  como  fork(2), crea un proceso hijo del proceso invocador. Para
       mas detalles, valor devuelto y errores, vea fork(2).

       vfork() es un caso especial de clone(2).  Se usa  para  crear  procesos
       nuevos  sin  copiar  las tablas de paginas del proceso padre. Puede ser
       util en aplicaciones sensibles al rendimiento donde se creara  un  hijo
       que a continuacion realizara inmediatamete una llamada execve().

       vfork()  se diferencia de fork en que se suspende al padre hasta que el
       hijo hace una llamada execve(2) o _exit(2).  El hijo  comparte  con  su
       padre  toda  la memoria, incluyendo la pila, hasta que el hijo invoca a
       execve().  El hijo no debe regresar de la funcion  actual  o  llamar  a
       exit(), pero puede llamar a _exit().

       Los  manejadores  de senal se heredan pero no se comparten. Las senales
       destinadas al padre llegan despues de que el hijo lo libere.

DESCRIPCI'ON HIST'ORICA

       En Linux fork() se implementa usando paginas de "copia  en  escritura",
       por  lo que la unica penalizacion en la que incurre fork() es el tiempo
       y memoria necesarios para duplicar las tablas de paginas  del  padre  y
       crear  una estructura de tarea para el hijo.  Sin embargo, en los malos
       tiempos, un fork() requeria hacer una copia  completa  del  espacio  de
       datos  del  invocador,  a menudo de forma inutil ya que, usualmente, se
       realizaba inmediatamente despues una llamada exec().  Por  tanto,  para
       una  mayor eficiencia, BSD introdujo la llamada al sistema vfork que no
       copiaba totalmente el espacio de direcciones del  proceso  padre,  sino
       que  tomaba prestados la memoria del padre y su hilo de ejecucion hasta
       que se producia una llamada a  execve()  o  un  fin  de  ejecucion.  El
       proceso padre se suspendia mientras el hijo usaba sus recursos.  El uso
       de vfork era delicado (por ejemplo, el no modificar datos en el proceso
       padre dependia de saber que variables se mantenian en un registro).

FALLOS

       Es  bastante  desafortunado  que  Linux haya revivido este espectro del
       pasado.  La pagina de manual de BSD establece: "Esta llamada al sistema
       se  eliminara  cuando  se  implementen mecanismos del sistema adecuados
       para comparticion. Los usuarios no deberian confiar en la semantica  de
       comparticion  de  memoria de vfork ya que, en ese momento, sera igual a
       fork."

       Formalmente hablando, la descripcion estandar  dada  antes  no  permite
       usar  vfork()  ya  que  un  exec  posterior  podria  fallar  y lo que a
       continuacion ocurra es indefinido.

       Los detalles del  manejo  de  senales  son  oscuros  y  difieren  entre
       sistemas.  La  pagina  de  manual de BSD dice: "Para evitar una posible
       situacion de abrazo mortal, a aquellos procesos hijos que se encuentran
       a  mitad  de  una  llamada vfork nunca se les envia una senal SIGTTOU o
       SIGTTIN. En su lugar, se  permiten  la  salida  o  las  ioctls,  y  los
       intentos de entrada dan lugar a una indicacion de "fin de fichero"."

       Actualmente  (Linux  2.3.25),  strace(1)  no  puede seguir un vfork() y
       necesita un parche del nucleo.

HISTORIA

       La llamada al sistema vfork() aparecio en 3.0BSD.  En BSD 4.4  se  hizo
       sinonima    de   fork(),   pero   NetBSD   la   introdujo   de   nuevo,
       http://www.netbsd.org/Documentation/kernel/vfork.html.   En  Linux   ha
       sido  equivalente  a  fork()  hasta  la version 2.2.0-pre6 mas o menos.
       Desde  la  version  2.2.0-pre9  (en  i386,  algo  mas  tarde  en  otras
       arquitecturas) es una llamada al sistema independiente. El soporte para
       esta llamada se anadio en la version 2.0.112 de glibc.

CONFORME A

       La llamada vfork se puede parecer un poco a las llamadas con  el  mismo
       nombre  en otro sistema operativo. Los requisitos sobre vfork impuestos
       por los estandares son mas debiles que aquellos impuestos  sobre  fork,
       por  lo  que  una  implementacion  el  la que las dos sean sinonimas es
       correcta.  En particular, el programador no puede  confiar  en  que  el
       padre  se  quede  bloqueado hasta una llamada a execve() o _exit() y no
       puede confiar en ningun comportamiento  especifico  en  relacion  a  la
       memoria compartida.

V'EASE TAMBI'EN

       clone(2), execve(2), fork(2), wait(2)