flock(2) System Calls Manual flock(2) NOMBRE flock - impone o elimina un bloqueo de recomendacion en un archivo abierto. BIBLIOTECA Biblioteca Estandar C (libc, -lc) SINOPSIS #include int flock(int fd, int op); DESCRIPCION Aplica o elimina un bloqueo de aviso en el archivo abierto indicado por fd. El argumento op sera uno de los siguientes: LOCK_SH Pone un bloqueo compartido. Mas 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 descripcion de archivo abierto (vease 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. Ademas, el bloqueo se libera mediante una operacion LOCK_UN explicita en cualquiera de estos descriptores duplicados o cuando se han cerrado todos ellos. Si un proceso utiliza open(2) (o similar) para obtener mas de un descriptor de archivo para el mismo archivo, flock() tratara 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 convertiran 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 exito 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 notificacion de una senal atrapada por un manejador; vea signal(7). EINVAL op no es valido. ENOLCK El nucleo se quedo sin memoria para almacenar registros de bloqueos. EWOULDBLOCK El fichero esta 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 si misma, en lugar de emularse en la biblioteca GNU C como una llamada a fcntl(2). Con esta implementacion, no hay interaccion 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 interactuan entre si. Detalles de CIFS A partir de la version 5.4, flock() no se despliega sobre SMB. Un archivo con estos bloqueos, no aparecera 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() interactuan entre si. Otra consecuencia importante es que los bloqueos ya no son consultivos: cualquier operacion de E/S en un archivo bloqueado siempre fallara con EACCES cuando se realice desde un descriptor de archivo independiente. Esta diferencia se debe al diseno de los bloqueos en el protocolo SMB, que proporciona una sintaxis obligatoria de bloqueo. La sintaxis de bloqueo remoto y obligatorio puede variar segun el protocolo SMB, las opciones de montaje y el tipo de servidor. Consulte mount.cifs(8) para obtener mas informacion. ESTANDARES BSD. HISTORIAL 4.4BSD (la llamada al sistema flock() aparecio por primera vez en 4.2BSD). Una version de flock(), posiblemente implementada en terminos de fcntl(2), aparece en la mayoria 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 podria usar el bloqueo de rango de bytes fcntl(2), que funciona en NFS, siempre que se cuente con una version reciente de Linux y un servidor compatible con el bloqueo. A partir de Linux 2.6.12, los clientes NFS admiten bloqueos flock() emulandolos como bloqueos de rango de bytes fcntl(2) en todo el archivo. Esto significa que los bloqueos fcntl(2) y flock() interactuan entre si en NFS. Tambien significa que, para colocar un bloqueo exclusivo, el archivo debe estar abierto para escritura. Desde Linux 2.6.37, el nucleo admite un modo de compatibilidad que permite que los bloqueos flock(), y tambien los bloqueos de region de bytes fcntl(2) se traten como locales; consulte la explicacion de la opcion local_lock en nfs(5). NOTAS flock() coloca bloqueos de recomendacion 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() sera diferente a la descrita en esta pagina de manual. No se garantiza que la conversion 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 conversion se bloquea o falla si se definio LOCK_NB. (Este es el comportamiento original de BSD y sucede en muchas otras implementaciones). VEASE TAMBIEN flock(1), close(2), dup(2), execve(2), fcntl(2), fork(2), open(2), lockf(3), lslocks(8) Documentation/filesystems/locks.txt en el codigo fuente de Linux (Documentation/locks.txt en nucleos anteriores). TRADUCCION La traduccion al espanol de esta pagina del manual fue creada por Gerardo Aburruzaga Garcia , Juan Piernas , Miguel Perez Ibars y Marcos Fouces Esta traduccion es documentacion libre; lea la GNU General Public License Version 3 o posterior con respecto a las condiciones de copyright. No existe NINGUNA RESPONSABILIDAD. Si encuentra algun error en la traduccion de esta pagina del manual, envie un correo electronico a . Paginas de Manual de Linux 6.15 17 Mayo 2025 flock(2)