flock(2)

NOMBRE
flock - impone o elimina un bloqueo de recomendación en un archivo abierto.

BIBLIOTECA
Biblioteca Estándar C (libc, -lc)

SINOPSIS
#include <sys/file.h>

int flock(int fd, int op);

DESCRIPCIÓN
Aplica o elimina un bloqueo de aviso en el archivo abierto indicado por fd. El argumento op será uno de los siguientes:

    LOCK_SH
        Pone un bloqueo compartido. Más de un proceso puede tener un bloqueo compartido para un fichero en un momento dado.

    LOCK_EX
        Pone un bloqueo exclusivo. Solamente un proceso puede tener un bloqueo exclusivo para un fichero en un momento dado.

    LOCK_UN
        Elimina un bloqueo existente mantenido por este proceso.

Una llamada a flock() puede bloquearse si otro proceso mantiene un bloqueo incompatible. Para hacer una solicitud no bloqueante, incluya LOCK_NB (mediante operaciones OR) con cualquiera de las operaciones de arriba.

Un fichero no puede tener simultaneamente bloqueo compartido y exclusivo.

Los bloqueos creados por flock() se asocian a una descripción de archivo abierto (véase open(2)). Esto significa que los descriptores de archivo duplicados (creados, por ejemplo, por fork(2) o dup(2)) hacen referencia al mismo bloqueo, y este puede modificarse o liberarse utilizando cualquiera de estos descriptores de archivo. Además, el bloqueo se libera mediante una operación LOCK_UN explícita en cualquiera de estos descriptores duplicados o cuando se han cerrado todos ellos.

Si un proceso utiliza open(2) (o similar) para obtener más de un descriptor de archivo para el mismo archivo, flock() tratará estos descriptores de archivo de forma independiente. Un intento de bloquear el archivo usando uno de estos descriptores de archivo puede ser denegado por un bloqueo que el proceso que realiza la llamada ya haya establecido mediante otro descriptor.

Un proceso puede tener solamente un tipo de bloqueo (compartido o exclusivo) sobre un fichero. Las llamadas posteriores a flock() sobre un fichero ya bloqueado convertirán un bloqueo existente al nuevo modo de bloqueo.

Los bloqueos creados con flock() se preservan tras un execve(2).

Un bloqueo compartido o exclusivo puede ponerse sobre un fichero sin importar el modo en el que fue abierto dicho fichero.

VALOR DEVUELTO
En caso de éxito se devuelve cero. En caso de error se devuelve -1, y errno se configura para indicar el error.

ERRORES

EBADF
    fd no es un descriptor de archivos abiertos.

EINTR
    Mientras se esperaba por adquirir un bloqueo, la llamada fue interrumpida por la notificación de una señal atrapada por un manejador; vea signal(7).

EINVAL
    op no es válido.

ENOLCK
    El núcleo se quedó sin memoria para almacenar registros de bloqueos.

EWOULDBLOCK
    El fichero está encadenado y la bandera LOCK_NB ha sido elegida. TP EBADF fd no es un descriptor de fichero abierto.

VERSIONES
A partir de Linux 2.0, flock() se implementa como una llamada al sistema por sí misma, en lugar de emularse en la biblioteca GNU C como una llamada a fcntl(2). Con esta implementación, no hay interacción entre los tipos de bloqueo establecidos por flock() y fcntl(2), y flock() no detecta interbloqueos. Sin embargo, cabe destacar que en algunos sistemas, como los BSD modernos, los bloqueos flock() y fcntl(2) si interactúan entre sí.

  Detalles de CIFS
A partir de la versión 5.4, flock() no se despliega sobre SMB. Un archivo con estos bloqueos, no aparecerá bloqueado para usuarios remotos.

A partir de Linux 5.5, los bloqueos flock() se emulan con bloqueos de rango de bytes SMB en todo el archivo. Al igual que en NFS, esto significa que los bloqueos fcntl(2) y flock() interactúan entre sí. Otra consecuencia importante es que los bloqueos ya no son consultivos: cualquier operación de E/S en un archivo bloqueado siempre fallará con EACCES cuando se realice desde un descriptor de archivo independiente. Esta diferencia se debe al diseño de los bloqueos en el protocolo SMB, que proporciona una sintaxis obligatoria de bloqueo.

La sintaxis de bloqueo remoto y obligatorio puede variar según el protocolo SMB, las opciones de montaje y el tipo de servidor. Consulte mount.cifs(8) para obtener más información.

ESTÁNDARES
BSD.

HISTORIAL
4.4BSD (la llamada al sistema flock() apareció por primera vez en 4.2BSD). Una versión de flock(), posiblemente implementada en términos de fcntl(2), aparece en la mayoría de UNIX's.

  Detalles de NFS
Hasta Linux 2.6.11, flock() no bloquea archivos en NFS (es decir, el alcance de los bloqueos se limitaba al sistema local). En su lugar, se podría usar el bloqueo de rango de bytes fcntl(2), que funciona en NFS, siempre que se cuente con una versión reciente de Linux y un servidor compatible con el bloqueo.

A partir de Linux 2.6.12, los clientes NFS admiten bloqueos flock() emulándolos como bloqueos de rango de bytes fcntl(2) en todo el archivo. Esto significa que los bloqueos fcntl(2) y flock() interactúan entre sí en NFS. También significa que, para colocar un bloqueo exclusivo, el archivo debe estar abierto para escritura.

Desde Linux 2.6.37, el núcleo admite un modo de compatibilidad que permite que los bloqueos flock(), y también los bloqueos de región de bytes fcntl(2) se traten como locales; consulte la explicación de la opción local_lock en nfs(5).

NOTAS
flock() coloca bloqueos de recomendación solamente; con los permisos adecuados sobre un fichero, un proceso es libre de ignorar el uso de flock() y realizar E/S sobre el fichero.

Los bloqueos flock() y fcntl(2) tienen una sintaxis diferente con respecto a los procesos bifurcados y dup(2). En sistemas que implementan flock() mediante fcntl(2), la sintaxis de flock() será diferente a la descrita en esta página de manual.

No se garantiza que la conversión de un bloqueo (compartido a exclusivo, o viceversa) sea en conjunto: primero se elimina el bloqueo existente y luego se establece uno nuevo. Entre estos dos pasos, puede concederse una solicitud de bloqueo pendiente de otro proceso, con el resultado de que la conversión se bloquea o falla si se definió LOCK_NB. (Este es el comportamiento original de BSD y sucede en muchas otras implementaciones).

Release of a lock when a file descriptor is closed is not sequenced after all observable effects of close(2). For example, if one process writes a file while holding an exclusive lock, then closes that file, and another process blocks placing a shared lock on that file to wait until it is closed, it may observe that a subsequent execve(2) of that file fails with ETXTBSY, and umount(2) of its underlying filesystem fails with EBUSY, as if the file were still open in the first process.

VÉASE TAMBIÉN
flock(1), close(2), dup(2), execve(2), fcntl(2), fork(2), open(2), lockf(3), lslocks(8)

Documentation/filesystems/locks.rst in the Linux kernel source tree

TRADUCCIÓN
La traducción al español de esta página del manual fue creada por Gerardo Aburruzaga García <gerardo.aburruzaga@uca.es>, Juan Piernas <piernas@ditec.um.es>, Miguel Pérez Ibars <mpi79470@alu.um.es> y Marcos Fouces <marcos@debian.org>

Esta traducción es documentación libre; lea la GNU General Public License Version 3 (https://www.gnu.org/licenses/gpl-3.0.html) o posterior con respecto a las condiciones de copyright. No existe NINGUNA RESPONSABILIDAD.

Si encuentra algún error en la traducción de esta página del manual, envíe un correo electrónico a debian-l10n-spanish@lists.debian.org.