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ÓN ESTÁNDAR

       (Según  XPG4  /  SUSv2  / borrador POSIX.)  La función 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 función en la que se llamó a vfork()
       o bien llama a cualquier otra función  antes  de  llamar  con  éxito  a
       _exit() o a una de las funciones de la familia exec.

ERRORES

       EAGAIN Demasiados procesos. Inténtelo de nuevo.

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

DESCRIPCIÓN DE LINUX

       vfork,  como  fork(2), crea un proceso hijo del proceso invocador. Para
       más 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 páginas del proceso padre. Puede ser
       útil en aplicaciones sensibles al rendimiento donde se creará  un  hijo
       que a continuación realizará 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 función  actual  o  llamar  a
       exit(), pero puede llamar a _exit().

       Los  manejadores  de señal se heredan pero no se comparten. Las señales
       destinadas al padre llegan después de que el hijo lo libere.

DESCRIPCIÓN HISTÓRICA

       En Linux fork() se implementa usando páginas de "copia  en  escritura",
       por  lo que la única penalización en la que incurre fork() es el tiempo
       y memoria necesarios para duplicar las tablas de páginas  del  padre  y
       crear  una estructura de tarea para el hijo.  Sin embargo, en los malos
       tiempos, un fork() requería hacer una copia  completa  del  espacio  de
       datos  del  invocador,  a menudo de forma inútil ya que, usualmente, se
       realizaba inmediatamente después 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 ejecución hasta
       que se producía una llamada a  execve()  o  un  fin  de  ejecución.  El
       proceso padre se suspendía mientras el hijo usaba sus recursos.  El uso
       de vfork era delicado (por ejemplo, el no modificar datos en el proceso
       padre dependía de saber qué variables se mantenían en un registro).

FALLOS

       Es  bastante  desafortunado  que  Linux haya revivido este espectro del
       pasado.  La página de manual de BSD establece: "Esta llamada al sistema
       se  eliminará  cuando  se  implementen mecanismos del sistema adecuados
       para compartición. Los usuarios no deberían confiar en la semántica  de
       compartición  de  memoria de vfork ya que, en ese momento, será igual a
       fork."

       Formalmente hablando, la descripción estándar  dada  antes  no  permite
       usar  vfork()  ya  que  un  exec  posterior  podría  fallar  y lo que a
       continuación ocurra es indefinido.

       Los detalles del  manejo  de  señales  son  oscuros  y  difieren  entre
       sistemas.  La  página  de  manual de BSD dice: "Para evitar una posible
       situación de abrazo mortal, a aquellos procesos hijos que se encuentran
       a  mitad  de  una  llamada vfork nunca se les envía una señal SIGTTOU o
       SIGTTIN. En su lugar, se  permiten  la  salida  o  las  ioctls,  y  los
       intentos de entrada dan lugar a una indicación de "fin de fichero"."

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

HISTORIA

       La llamada al sistema vfork() apareció en 3.0BSD.  En BSD 4.4  se  hizo
       sinónima    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 versión 2.2.0-pre6 más o menos.
       Desde  la  versión  2.2.0-pre9  (en  i386,  algo  más  tarde  en  otras
       arquitecturas) es una llamada al sistema independiente. El soporte para
       esta llamada se añadió en la versión 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 estándares son más débiles que aquellos impuestos  sobre  fork,
       por  lo  que  una  implementación  el  la que las dos sean sinónimas 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 ningún comportamiento  específico  en  relación  a  la
       memoria compartida.

VÉASE TAMBIÉN

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