subrutina fork, f_fork o vfork

Finalidad

Crea un proceso nuevo.

Bibliotecas

fork, f_forky vfork: Biblioteca C estándar (libc.a)

Sintaxis

#include <unistd.h>
pid_t fork(void)
pid_t f_fork(void)
int vfork(void)

Descripción

La subrutina fork crea un nuevo proceso. El proceso nuevo (proceso hijo) es una copia casi exacta del proceso de llamada (proceso padre). El proceso hijo hereda los atributos siguientes del proceso padre:

  • entorno
  • Banderas de cierre en ejecución (descritas en la subrutina exec )
  • Ajustes de gestión de señales (como el valor SIG_DFL, el valor SIG_IGN y el parámetro Function Address )
  • Establecer bit de modo de ID de usuario
  • Establecer bit de modo de ID de grupo
  • Estado de activación y desactivación de perfiles
  • Valor de Niza
  • ' Todas las bibliotecas compartidas adjuntas
  • ID del grupo de proceso
  • tty group ID (descrito en la subrutina exit, atexit, o _exit, subrutina signal, y subrutina raise )
  • Directorio actual
  • Directorio raíz
  • Máscara de creación de modo de archivo (descrita en la subrutina umask )
  • Límite de tamaño del fichero (descrito en la subrutina ulimit )
  • ' Adjuntar segmentos de memoria compartida (descritos en la subrutina shmat )
  • ' Adjuntar segmentos de archivo asignados (descritos en la subrutina shmat )
  • ID del proceso depurador y bandera multiproceso si el proceso padre tiene habilitada la depuración multiproceso (descrita en la subrutina ptrace ).

El proceso hijo difiere del proceso padre de las maneras siguientes:

  • El proceso hijo sólo tiene un hilo de usuario; es el que llamó a la subrutina fork.
  • ' El proceso hijo tiene un ID de proceso único.
  • El ID del proceso hijo no coincide con ningún ID de grupo de procesos activo.
  • El proceso hijo tiene un ID de proceso padre diferente.
  • El proceso hijo tiene su propia copia de los descriptores de fichero del proceso padre. Sin embargo, cada descriptor de archivo del proceso hijo comparte un puntero de archivo común con el descriptor de archivo correspondiente del proceso padre.
  • ' Se borran todos los valores semadj. Para obtener información sobre los valores semadj, consulte la subrutina semop.
  • ' Los bloqueos de proceso, bloqueos de texto y bloqueos de datos no son heredados por el proceso hijo. Para obtener información sobre bloqueos, consulte la subrutina plock.
  • 'Si la depuración multiproceso está activada, las banderas ' rastrear ' se heredan del padre; en caso contrario, se reinician las banderas rastrear '. Para obtener información sobre la petición 0, consulte la subrutina ptrace.
  • Las subrutinas del proceso hijo utime, stime, cutime y cstime se ponen a 0. (Para más información, consulte las subrutinas getrusage, times y vtimes )
  • Las alarmas pendientes se borran en el proceso hijo. (Para más información, consulte las subrutinas incinterval, setitimer y alarm )
  • El conjunto de señales pendientes para el proceso hijo se inicializa a un conjunto vacío.
  • ' El proceso hijo puede tener su propia copia del catálogo de mensajes del proceso padre.
Atención: Si utiliza las subrutinas fork o vfork con una aplicación X Window System, X Toolkit o Motif, abra una conexión de pantalla (socket) independiente para el proceso forked. Si el proceso hijo utiliza la misma conexión de pantalla que el padre, el servidor X no podrá interpretar los datos resultantes.

La subrutina F_ es similar a fork, excepto:

  • Es necesario que el proceso hijo llame a una de las funciones de exec inmediatamente después de su creación. Dado que los manejadores de bifurcación nunca son llamados, los datos de la aplicación, los mutexes y los bloqueos están todos indefinidos en el proceso hijo.

La subrutina vfork está soportada como interfaz de compatibilidad para programas de sistema antiguos de la Berkeley Software Distribution (BSD) y puede utilizarse compilando con la Berkeley Compatibility Librarylibbsd.a).

En la versión 4 del sistema operativo, el proceso padre no tiene que esperar a que el hijo salga o se ejecute, como ocurre en los sistemas BSD. El proceso hijo recibe un nuevo espacio de direcciones, como en la subrutina fork. El proceso hijo no comparte ningún espacio de direcciones padre.

Atención: Cuando se utilizan las subrutinas fork o vfork con una aplicación Enhanced X-Windows, X Toolkit o Motif, debe abrirse una conexión de pantalla (socket) separada para el proceso forked. El proceso hijo nunca debe utilizar la misma conexión de pantalla que el padre. Las conexiones de visualización se personalizan con sockets y los sockets se heredan mediante el proceso hijo. Cualquier intento de que varios procesos escriban a la misma conexión de pantalla da como resultado la intercalación aleatoria de paquetes de protocolo X a nivel de palabra. Los datos resultantes escritos en el socket no serán paquetes de protocolo X válidos o no definidos, y el servidor X no podrá interpretarlo.
Atención: Aunque las subrutinas fork y vfork pueden utilizarse con aplicaciones de la Biblioteca Gráfica, el proceso hijo no debe realizar ninguna llamada adicional a subrutinas de la Biblioteca Gráfica. La aplicación hijo hereda algunos, pero no todos los recursos de hardware de gráficos del padre. El dibujo por el proceso hijo puede colgar el adaptador de gráficos, el servidor X mejorado o puede causar resultados imprevisibles y colocar el sistema en un estado imprevisible.

Para obtener información adicional, consulte el archivo /usr/lpp/GL/README .

Valores de retorno

Una vez completada con éxito, la subrutina fork devuelve el valor 0 al proceso hijo y devuelve el ID del proceso hijo al proceso padre. En caso contrario, se devuelve un valor de -1 al proceso padre, no se crea ningún proceso hijo y se establece la variable global errno para indicar el error.

Códigos de error

La subrutina de bifurcación no tiene éxito si se cumple una o más de las siguientes condiciones:

Elemento Descripción
FEAGA Supera el límite del número total de procesos que se ejecutan en todo el sistema o por un único usuario, o el sistema no dispone de los recursos necesarios para crear otro proceso.
ENOMEM No existe suficiente espacio para este proceso.
EPROCLIM Si WLM está en ejecución, es posible que se haya cumplido el límite del número de procesos o hebras de la clase.