bionic (2) vfork.2.gz

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)