Provided by: manpages-es_1.55-8_all bug

NOMBRE

       futex - llamada al sistema para bloqueos rápidos 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ÓN

       La llamada al sistema sys_futex proporciona un método que permite a  un
       programa  esperar  hasta que cambie el valor de una dirección dada y un
       método para despertar a cualquier proceso que  esté  esperando  en  una
       dirección  particular  (aunque  las  direcciones para una misma zona de
       memoria en procesos separados pueden no  ser  iguales,  el  núcleo  las
       proyecta   internamente   para  que  la  misma  memoria  proyectada  en
       direcciones distintas concuerde para  diferentes  llamadas  sys_futex).
       Típicamente  se usa para implementar el caso de contienda de un bloqueo
       en memoria compartida, como se describe en futex(4).

       Cuando una operación futex(4)  termina  con  contienda  en  espacio  de
       usuario,  es necesario hacer una llamada al núcleo 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 función se adhieran a la
       semántica que se expone en  futex(4).  Ya  que  esta  semántica  supone
       escribir  instrucciones  en  ensamblador no (trans)portables, esto a su
       vez probablemente significa que la mayoría de  los  usuarios  serán  de
       hecho   autores  de  bibliotecas  y  no  desarrolladores  genéricos  de
       aplicaciones.

       Es necesario que el argumento futex apunte a  un  entero  alineado  que
       almacene  el  contador.  La  operación  a ejecutar se pasa a través del
       parámetro op junto con un valor val.

       Actualmente se definen tres operaciones:

       FUTEX_WAIT
              Esta operación  verifica  atómicamente  si  la  dirección  futex
              contiene  todavía el valor dado y bloquea al proceso a la espera
              de FUTEX_WAKE en esta dirección futex. Si el  argumento  timeout
              no  es  NULL,  su  contenido  describe  la duración máxima 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 contención) y se bloqueará  hasta  que
              otro  proceso libere el futex y ejecute la operación FUTEX_WAKE.

       FUTEX_WAKE
              Esta operación despierta, como mucho, val procesos  que  esperan
              en  esta dirección futex (es decir, dentro de FUTEX_WAIT).  Para
              futex(4), esta llamada se ejecuta si al incrementar el  contador
              se  vio  que había procesos esperando una vez que al futex se le
              ha asignado el valor 1 (indicando que está disponible).

       FUTEX_FD
              Para soportar despertares asíncronos, esta operación  asocia  un
              descriptor  de  fichero con un futex. Si otro proceso ejecuta un
              FUTEX_WAKE, el proceso recibirá el número de señal que  se  pasó
              en  val.  El  proceso  invocador  debe  cerrar  el descriptor de
              fichero devuelto después de su uso.

              Para evitar condiciones de carrera, el invocador debe  comprobar
              si  se ha incrementado el futex después de que FUTEX_FD regrese.

VALOR DEVUELTO

       Dependiendo de la operación 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 operación devuelve EWOULDBLOCK. Las señales (u  otros  falsos
              despertares) hacen que FUTEX_WAIT devuelva EINTR.

       FUTEX_WAKE
              Devuelve el número de procesos despertados.

       FUTEX_FD
              Devuelve el nuevo descriptor de fichero asociado al futex.

OBSERVACIONES

       Insistimos, los futexes, en su forma más básica, no están pensados como
       abstracción sencilla para los usuarios finales. Es de esperar  que  los
       implementadores  sean  buenos  conocedores  de  ensamblador y que hayan
       leído los fuentes de la biblioteca de futex en espacio de  usuario  que
       se indica más abajo.

AUTORES

       Los  futexes  fueron diseñados 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 página fue
       escrita por Bert Hubert.

VERSIONES

       El soporte inicial para futex se añadió a la  versión  2.5.7  de  Linux
       pero  con una semántica distinta a la descrita más arriba. La semántica
       actual se encuentra disponible desde la versión 2.5.40 de Linux.

VÉASE TAMBIÉN

       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)