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)