Provided by:
manpages-es_1.55-10_all 
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)