lockf - aplica, comprueba o elimina un bloqueo POSIX sobre un
fichero abierto
#include <sys/file.h>
int lockf(int fd, int cmd, off_t
len);
Aplica, comprueba o elimina un bloqueo POSIX sobre una
sección de un fichero abierto. El fichero está especificado
por fd, un descriptor de fichero abierto para escritura, la
acción por cmd, y la sección consiste en las posiciones
de byte pos..pos+len-1, si len es positivo, y
pos-len..pos-1, si len es negativo, donde pos es
la posición actual del fichero. Si len es cero, la
sección se extiende desde la posición actual del fichero al
infinito, abarcando las posiciones actual y futura de «fin de
fichero». En todos los casos, la sección se puede extender
más alla del «fin de fichero» actual.
En Linux, esta llamada es tan solo una interfaz para
fcntl(2). (En general, la relación entre lockf y
fcntl es indefinida.)
Las operaciones válidas son:
- F_LOCK
- Establece un bloqueo exclusivo en la sección especificada del
fichero. Si (parte de) esta sección ya está bloqueada, la
llamada se bloquea hasta que el bloqueo anterior sea liberado. Si esta
sección se solapa con una sección previamente bloqueada,
ambas se fusionan. Los bloqueos sobre el fichero son liberados tan pronto
como el proceso que mantiene los bloqueos cierre algunos descriptores de
fichero para el fichero. Un proceso hijo no hereda estos bloqueos.
- F_TLOCK
- Igual que F_LOCK pero la llamada nunca se bloquea y devuelve un
error en su lugar si el fichero ya está bloqueado.
- F_ULOCK
- Desbloquea la sección indicada del fichero. Ésto puede
provocar que una sección bloqueada se divida en dos secciones
bloqueadas.
- F_TEST
- Comprueba el bloqueo: devuelve 0 si la sección especificada
está desbloqueada o bloqueada por este proceso; devuelve -1 y
asigna a errno el valor EACCES si otro proceso mantiene un
bloqueo.
En caso de éxito, se devuelve cero. En caso de error, se
devuelve -1 y se modifica errno apropiadamente.
- EAGAIN
- El fichero está bloqueado y se especificó F_TLOCK o
F_TEST, o se prohibe la operación porque el fichero ha sido
ubicado en memoria por otro proceso.
- EBADF
- fd no es un descriptor de fichero abierto.
- EDEADLK
- La orden fue T_LOCK y esta operación de bloqueo
causaría una situación de interbloqueo.
- EINVAL
- Se especificó una operación inválida en
fd.
- ENOLCK
- Demasiados bloqueos de segmento abiertos, la tabla de bloqueos está
llena.
fcntl(2), flock(2)
Pueden encontrarse también los ficheros locks.txt y
mandatory.txt en /usr/src/linux/Documentation.