NOMBRE¶
flock - impone o elimina un candado de recomendación en un fichero
abierto.
SINOPSIS¶
#include <sys/file.h>
int flock(int fd
, int operation
);
DESCRIPCIÓN¶
Impone o elimina un candado de recomendación (advisory lock) sobre el
fichero abierto especificado por
fd. El parámetro
operation puede tener uno de los siguientes valores:
- LOCK_SH
- Pone un candado compartido. Más de un proceso puede tener un
candado compartido para un fichero en un momento dado.
- LOCK_EX
- Pone un candado exclusivo. Solamente un proceso puede tener un candado
exclusivo para un fichero en un momento dado.
- LOCK_UN
- Elimina un candado existente mantenido por este proceso.
Una llamada a
flock() puede bloquearse si otro proceso mantiene un
candado 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 candados compartido y exclusivo.
Los candados creados por
flock() se asocian con un fichero, o, más
concretamente, con una entrada de la tabla de ficheros abiertos. Esto
significa que los descriptores de fichero duplicados (creados con, por
ejemplo,
fork(2) o
dup(2)) hacen referencia al mismo candado, y
este candado puede ser modificado o liberado usando cualquiera de estos
descriptores. Además, el candado es bloqueado bien por una
operación
LOCK_UN explícita sobre cualquiera de estos
descriptores duplicados, o cuando todos estos descriptores han sido cerrados.
Un proceso puede tener solamente un tipo de candado (compartido o exclusivo)
sobre un fichero. Las llamadas posteriores a
flock() sobre un fichero
ya bloqueado convertirán un candado existente al nuevo modo de bloqueo.
Los candados creados con
flock() se preservan tras un
execve(2).
Un candado 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, cero, En caso de error, -1 , y se pone en
errno
un código apropiado.
ERRORES¶
- EWOULDBLOCK
- El fichero está encadenado y la bandera LOCK_NB ha sido
elegida. TP EBADF fd no es un descriptor de fichero
abierto.
- EINTR
- Mientras se esperaba por adquirir un candado, la llamada fue interrumpida
por la notificación de una señal atrapada por un
manejador.
- EINVAL
- operation no es válido.
- ENOLCK
- El núcleo se quedó sin memoria para almacenar registros de
candados.
4.4BSD (la llamada al sistema
flock(2) apareció por primera vez en
4.2BSD). Una versión de
flock(2), posiblemente implementada en
términos de
fcntl(2), aparece en la mayoría de Unix's.
OBSERVACIONES¶
flock(2) no impone candados en ficheros sobre NFS. Use
fcntl(2) en
su lugar: funcionará sobre NFS, dada una versión suficientemente
reciente de Linux y un servidor que soporte candados.
Desde la versión 2.0 del núcleo,
flock(2) está
implementada como una llamada al sistema en lugar de ser emulada en la
biblioteca C de GNU como una llamada a
fcntl(2). Esto da verdadera
semántica BSD: no hay interacción entre los tipos de candado
colocados por
flock(2) y
fcntl(2), y
flock(2) no detecta
interbloqueo.
flock(2) coloca candados de recomendación solamente; con los
permisos adecuados sobre un fichero, un proceso es libre de ignorar el uso de
flock(2) y realizar E/S sobre el fichero.
Los candados de
flock(2) y
fcntl(2) tienen semánticas
diferentes con respecto a los procesos creados con fork y con respecto a
dup(2).
VÉASE TAMBIÉN¶
open(2),
close(2),
dup(2),
execve(2),
fcntl(2),
fork(2),
lockf(3)
También están
locks.txt y
mandatory.txt en
/usr/src/linux/Documentation.