Provided by:
manpages-es_1.55-10_all 
NOMBRE
futex - llamada al sistema para bloqueos rapidos en espacio de usuario
SINOPSIS
#include <linux/futex.h>
#include <sys/time.h>
int sys_futex (void *futex, int op, int val, const struct timespec
*timeout);
DESCRIPCI'ON
La llamada al sistema sys_futex proporciona un metodo que permite a un
programa esperar hasta que cambie el valor de una direccion dada y un
metodo para despertar a cualquier proceso que este esperando en una
direccion particular (aunque las direcciones para una misma zona de
memoria en procesos separados pueden no ser iguales, el nucleo las
proyecta internamente para que la misma memoria proyectada en
direcciones distintas concuerde para diferentes llamadas sys_futex).
Tipicamente se usa para implementar el caso de contienda de un bloqueo
en memoria compartida, como se describe en futex(4).
Cuando una operacion futex(4) termina con contienda en espacio de
usuario, es necesario hacer una llamada al nucleo para que arbitre. El
arbitraje puede significar o bloquear al proceso invocador o,
contrariamente, despertar a un proceso bloqueado.
Se espera que los procesos que llamen a esta funcion se adhieran a la
semantica que se expone en futex(4). Ya que esta semantica supone
escribir instrucciones en ensamblador no (trans)portables, esto a su
vez probablemente significa que la mayoria de los usuarios seran de
hecho autores de bibliotecas y no desarrolladores genericos de
aplicaciones.
Es necesario que el argumento futex apunte a un entero alineado que
almacene el contador. La operacion a ejecutar se pasa a traves del
parametro op junto con un valor val.
Actualmente se definen tres operaciones:
FUTEX_WAIT
Esta operacion verifica atomicamente si la direccion futex
contiene todavia el valor dado y bloquea al proceso a la espera
de FUTEX_WAKE en esta direccion futex. Si el argumento timeout
no es NULL, su contenido describe la duracion maxima de la
espera, que es infinita en otro caso. Para futex(4), esta
llamada se ejecuta si al decrementar el contador se obtuvo un
valor negativo (indicando contencion) y se bloqueara hasta que
otro proceso libere el futex y ejecute la operacion FUTEX_WAKE.
FUTEX_WAKE
Esta operacion despierta, como mucho, val procesos que esperan
en esta direccion futex (es decir, dentro de FUTEX_WAIT). Para
futex(4), esta llamada se ejecuta si al incrementar el contador
se vio que habia procesos esperando una vez que al futex se le
ha asignado el valor 1 (indicando que esta disponible).
FUTEX_FD
Para soportar despertares asincronos, esta operacion asocia un
descriptor de fichero con un futex. Si otro proceso ejecuta un
FUTEX_WAKE, el proceso recibira el numero de senal que se paso
en val. El proceso invocador debe cerrar el descriptor de
fichero devuelto despues de su uso.
Para evitar condiciones de carrera, el invocador debe comprobar
si se ha incrementado el futex despues de que FUTEX_FD regrese.
VALOR DEVUELTO
Dependiendo de la operacion que se haya ejecutado, el valor devuelto
puede tener significados diferentes.
FUTEX_WAIT
Devuelve 0 si el proceso fue despertado por una llamada
FUTEX_WAKE. En el caso de que haya expirado el plazo, se
devuelve ETIMEDOUT. Si el futex no era igual al valor esperado,
la operacion devuelve EWOULDBLOCK. Las senales (u otros falsos
despertares) hacen que FUTEX_WAIT devuelva EINTR.
FUTEX_WAKE
Devuelve el numero de procesos despertados.
FUTEX_FD
Devuelve el nuevo descriptor de fichero asociado al futex.
OBSERVACIONES
Insistimos, los futexes, en su forma mas basica, no estan pensados como
abstraccion sencilla para los usuarios finales. Es de esperar que los
implementadores sean buenos conocedores de ensamblador y que hayan
leido los fuentes de la biblioteca de futex en espacio de usuario que
se indica mas abajo.
AUTORES
Los futexes fueron disenados e implementados por Hubertus Franke (IBM
Thomas J. Watson Research Center), Matthew Kirkwood, Ingo Molnar (Red
Hat) y Rusty Russell (IBM Linux Technology Center). Esta pagina fue
escrita por Bert Hubert.
VERSIONES
El soporte inicial para futex se anadio a la version 2.5.7 de Linux
pero con una semantica distinta a la descrita mas arriba. La semantica
actual se encuentra disponible desde la version 2.5.40 de Linux.
V'EASE TAMBI'EN
futex(4), `Fuss, Futexes and Furwocks: Fast Userlevel Locking in Linux'
(actas del Ottawa Linux Symposium 2002), biblioteca de ejemplo de
futex, futex-*.tar.bz2
<URL:ftp://ftp.nl.kernel.org:/pub/linux/kernel/people/rusty/>.
31 diciembre 2002 FUTEX(2)