|
|
|
CLONE
Section: Manual del Programador de Linux (2) Updated: 25 Abril 1998 Index
Return to Main Contents
NOMBRE
__clone - crea un proceso hijo
SINOPSIS
#include <sched.h>
int __clone(int (*fn) (void *arg), void *child_stack, int flags, void *arg)
DESCRIPCIÓN
__clone
crea un nuevo proceso como lo hace
fork(2).
A diferencia de
fork(2),
__clone
permite al proceso hijo compartir partes de su contexto de ejecución con su
proceso padre, tales como el espacio de memoria, la tabla de descriptores de
fichero y la tabla de manejadores de señal. El principal uso de
__clone
es para implementar los hilos: múltiples hilos de control en un programa que
se ejecutan concurrentemente en un espacio de memoria compartido.
Cuando se crea el proceso hijo, éste ejecuta la función
fn(arg).
El argumento
fn
es un puntero a una función que es ejecutada por el proceso hijo al comienzo
de su ejecución.
El argumento
arg
se pasa a la función
fn.
Cuando la función
fn(arg)
regresa, el proceso hijo termina. El entero devuelto por
fn
es el código de salida del proceso hijo. El proceso hijo también puede
terminar explícitamente ejecutando
exit(1)
o después de recibir una señal fatal.
El argumento
child_stack
indica la posición de la pila utilizada por el proceso hijo. Aunque los
procesos padre e hijo pueden compartir la memoria, no es posible, en
general, para el proceso hijo ejecutarse usando la misma pila que
el proceso padre. Por tanto, el proceso padre debe preparar un
área de memoria para la pila del hijo y pasar un puntero a dicha área a
__clone.
Las pilas crecen hacia abajo en todos los procesadores en los que se ejecuta
Linux (excepto en el procesador HP PA), por lo que
child_stack
apunta normalmente a la dirección más alta de la zona de memoria preparada
para la pila del hijo.
El byte bajo de
flags
contiene el número de la señal enviada al padre cuando el hijo muere.
flags
puede también ser operado con un OR a nivel de bits (bitwise or) con
una o varias de las siguientes constantes, para así especificar qué van a
compartir los procesos padre e hijo:
- CLONE_VM
-
Si se pone
CLONE_VM,
los procesos padre e hijo se ejecutan en el mismo espacio de memoria. En
particular, la escrituras de memoria realizadas por el proceso padre o por
el proceso hijo también son visibles en el otro proceso. Además, cualquier
asociación o desasociación de memoria realizada con
mmap(2)
o
munmap(2)
por el proceso padre o hijo también afecta al otro proceso.
Si no se pone
CLONE_VM,
el proceso hijo se ejecuta en una copia particular del espacio de memoria
del padre en el momento de ejecutar
__clone.
Las escrituras de memoria o la asociación/desasociación de fichero realizada
por uno de los procesos no afecta al otro, como en el caso de
fork(2).
- CLONE_FS
-
Si se pone
CLONE_FS,
los procesos padre e hijo comparten la misma información del sistema de
ficheros. Ésta incluye la raíz del sistema de ficheros, el directorio de
trabajo actual y el valor de umask. Cualquier llamada a
chroot(2),
chdir(2)
o
umask(2)
realizada por el proceso padre o hijo también afecta al otro proceso.
Si no se pone
CLONE_FS,
el proceso hijo trabaja con una copia de la información del sistema de
ficheros del proceso padre en el momento de ejecutar
__clone.
Las llamadas a
chroot(2),
chdir(2)
o
umask(2)
realizadas después por uno de los procesos no afectan al otro.
- CLONE_FILES
-
Si se pone
CLONE_FILES,
los procesos padre e hijo comparten la misma tabla de descriptores de
fichero. Los descriptores de fichero siempre se refieren a los mismos
ficheros en el padre y en el proceso hijo. Cualquier descriptor de fichero
creado por el proceso padre o por el proceso hijo también es válido en el
otro proceso. De igual forma, si uno de los procesos cierra un descriptor de
fichero o cambia sus banderas (flags) asociadas, el otro proceso también se
verá afectado.
Si no se pone
CLONE_FILES,
el proceso hijo hereda una copia de todos los descriptores de fichero
abiertos en el proceso padre en el momento de ejecutar
__clone.
Las operaciones sobre los descriptores de fichero realizadas después por uno
de los procesos padre o hijo no afectan al otro.
- CLONE_SIGHAND
-
Si se pone
CLONE_SIGHAND,
los procesos padre e hijo comparten la misma tabla de manejadores de señal.
Si el proceso padre o hijo llama a
sigaction(2)
para cambiar el comportamiento asociado a una señal, el comportamiento
también se cambia en el otro proceso. Sin embargo, los procesos padre e hijo
todavía tienen diferentes máscaras de señales y conjuntos de señales
pendientes. Por tanto, uno de ellos puede bloquear o desbloquear algunas
señales usando
sigprocmask(2)
sin afectar al otro proceso.
Si no se pone
CLONE_SIGHAND,
el proceso hijo hereda una copia de los manejadores de señal del proceso
padre en el momento de ejecutar
__clone.
Las llamadas a
sigaction(2)
realizadas después por uno de los procesos no tendrán efecto sobre el otro
proceso.
- CLONE_PID
-
Si se pone
CLONE_PID,
se crea el proceso hijo con el mismo identificador de proceso que el proceso
padre.
Si no se pone
CLONE_PID,
el proceso hijo posee un identificador de proceso único, distinto del
identificador del padre.
.SHVALOR DEVUELTO
En caso de éxito, se devuelve el PID del hijo en el
hilo de ejecución del padre. En caso de fallo, se devuelve -1
en el contexto del padre, no se creará
ningún proceso hijo y se asignará a la variable
errno
un valor apropiado.
ERRORES
- EAGAIN
-
Se están ejecutando ya demasiados procesos.
- ENOMEM
-
__clone
no puede reservar suficiente memoria para obtener una estructura de tarea
(task structure) para el hijo o para copiar aquellas partes del contexto del
padre que necesitan ser copiadas.
FALLOS
Desde la versión 2.1.97 del núcleo, no se debe usar la bandera
CLONE_PID
ya que otras partes del núcleo y la mayoría del software del sistema todavía
asumen que los identificadores de proceso son únicos.
No hay una entrada para
__clone
en la versión 5 de libc. libc 6 (o sea, glibc 2) proporciona una llamada
__clone
tal como la que se ha descrito en esta página de manual.
CONFORME A
La llamada
__clone
es específica de Linux y no debería usarse en aquellos programas que
pretendan se portables. Para programar aplicaciones con hilos (múltiples
hilos de control en el mismo espacio de memoria) es mejor usar una
biblioteca que implemente la API de hilos POSIX 1003.1c, como la biblioteca
LinuxThreads. Vea
pthread_create(3thr).
Esta página de manual se corresponde con los núcleos 2.0.x y 2.1.x y con las
versiones 2.0.x de glibc.
VÉASE TAMBIÉN
fork(2),
pthread_create(3thr)
Index
- NOMBRE
-
- SINOPSIS
-
- DESCRIPCIÓN
-
- ERRORES
-
- FALLOS
-
- CONFORME A
-
- VÉASE TAMBIÉN
-
|