_locking
Bloquea o desbloquea los bytes de un archivo.
Sintaxis
int _locking(
int fd,
int mode,
long nbytes
);
Parámetros
fd
Descriptor del archivo.
mode
Acción de bloqueo que se va a realizar.
nbytes
Número de bytes que se van a bloquear.
Valor devuelto
_locking
devuelve 0 si es correcto. Un valor devuelto de -1 indica un error, en cuyo caso errno
se establece en uno de los valores siguientes.
Valor de errno |
Condición |
---|---|
EACCES |
Infracción de bloqueo (archivo ya bloqueado o desbloqueado). |
EBADF |
Descriptor de archivo no válido. |
EDEADLOCK |
Infracción de bloqueo. Se devuelve cuando se especifica la _LK_LOCK marca o _LK_RLCK y el archivo no se puede bloquear después de 10 intentos. |
EINVAL |
Se pasó un argumento no válido a _locking . |
Si el error se debe a un parámetro incorrecto, como un descriptor de archivo no válido, se invoca al controlador de parámetros no válidos, como se describe en Validación de parámetros.
Comentarios
La _locking
función bloquea o desbloquea nbytes
bytes del archivo especificado por fd
. El bloqueo de bytes en un archivo impide que otros procesos obtengan acceso a dichos bytes. Todo el bloqueo o desbloqueo comienza en la posición actual del puntero de archivo y continúa para los siguientes nbytes
bytes. Es posible bloquear bytes más allá del final del archivo.
mode
debe ser una de las siguientes constantes de manifiesto, que se definen en Locking.h.
Valor de mode |
Efecto |
---|---|
_LK_LOCK |
Bloquea los bytes especificados. Si los bytes no se pueden bloquear, el programa vuelve a intentarlo inmediatamente después de 1 segundo. Si los bytes no se pueden bloquear después de 10 intentos, la constante devuelve un error. |
_LK_NBLCK |
Bloquea los bytes especificados. Si los bytes no se pueden bloquear, la constante devuelve un error. |
_LK_NBRLCK |
Igual a _LK_NBLCK . |
_LK_RLCK |
Igual a _LK_LOCK . |
_LK_UNLCK |
Desbloquea los bytes especificados, que deben haberse bloqueado anteriormente. |
Se pueden bloquear varias regiones de un archivo que no se superponen. Para desbloquear una región, primero debe haberse bloqueado. _locking
no combina regiones adyacentes; si dos regiones bloqueadas son adyacentes, cada región debe desbloquearse por separado. Las regiones deberían bloquearse solo brevemente y deberían desbloquearse antes de cerrar un archivo o de salir del programa.
De manera predeterminada, el estado global de esta función está limitado a la aplicación. Para cambiar este comportamiento, consulte Estado global en CRT.
Requisitos
Routine | Encabezado necesario | Encabezado opcional |
---|---|---|
_locking |
<io.h> y <sys/locking.h> | <errno.h> |
Para obtener más información sobre compatibilidad, consulte Compatibilidad.
Bibliotecas
Todas las versiones de las bibliotecas en tiempo de ejecución de C.
Ejemplo
// crt_locking.c
/* This program opens a file with sharing. It locks
* some bytes before reading them, then unlocks them. Note that the
* program works correctly only if the file exists.
*/
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/locking.h>
#include <share.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <io.h>
int main( void )
{
int fh, numread;
char buffer[40];
/* Quit if can't open file or system doesn't
* support sharing.
*/
errno_t err = _sopen_s( &fh, "crt_locking.txt", _O_RDONLY, _SH_DENYNO,
_S_IREAD | _S_IWRITE );
printf( "%d %d\n", err, fh );
if( err != 0 )
exit( 1 );
/* Lock some bytes and read them. Then unlock. */
if( _locking( fh, LK_NBLCK, 30L ) != -1 )
{
long lseek_ret;
printf( "No one can change these bytes while I'm reading them\n" );
numread = _read( fh, buffer, 30 );
buffer[30] = '\0';
printf( "%d bytes read: %.30s\n", numread, buffer );
lseek_ret = _lseek( fh, 0L, SEEK_SET );
_locking( fh, LK_UNLCK, 30L );
printf( "Now I'm done. Do what you will with them\n" );
}
else
perror( "Locking failed\n" );
_close( fh );
}
Entrada: crt_locking.txt
The first thirty bytes of this file will be locked.
Salida de ejemplo
No one can change these bytes while I'm reading them
30 bytes read: The first thirty bytes of this
Now I'm done. Do what you will with them