Compartir vía


_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

Consulte también

Control de archivos
_creat, _wcreat
_open, _wopen