_locking

Bloqueia ou desbloqueia os bytes de um arquivo.

Sintaxe

int _locking(
   int fd,
   int mode,
   long nbytes
);

Parâmetros

fd
Descritor de arquivo.

mode
Bloqueio de ação a ser executada.

nbytes
O número de bytes a serem bloqueados.

Valor retornado

_locking retorna 0 se for bem-sucedido. Um valor retornado de -1 indica falha, caso errno em que é definido como um dos valores a seguir.

errno valor Condição
EACCES Violação de bloqueio (arquivo já foi bloqueado ou desbloqueado).
EBADF Descritor de arquivo inválido.
EDEADLOCK Violação de bloqueio. Retornado quando o sinalizador _LK_LOCK or _LK_RLCK é especificado e o arquivo não pode ser bloqueado após 10 tentativas.
EINVAL Um argumento inválido foi fornecido a _locking.

Se a falha for devido a um parâmetro inválido, como um descritor de arquivo inválido, o manipulador de parâmetro inválido será invocado, conforme descrito em Validação de parâmetro.

Comentários

A _locking função bloqueia ou desbloqueia nbytes bytes do arquivo especificado por fd. Os bytes bloqueados em um arquivo impedem o acesso a esses bytes por outros processos. Todo bloqueio ou desbloqueio começa na posição atual do ponteiro do arquivo e prossegue para os próximos nbytes bytes. É possível bloquear bytes após o final do arquivo.

mode deve ser uma das constantes de manifesto a seguir, que são definidas em Locking.h.

mode valor Efeito
_LK_LOCK Bloqueia os bytes especificados. Se os bytes não puderem ser bloqueados, o programa tentará imediatamente novamente após 1 segundo. Se os bytes não puderem ser bloqueados após 10 tentativas, a constante retornará um erro.
_LK_NBLCK Bloqueia os bytes especificados. Se os bytes não puderem ser bloqueados, a constante retornará um erro.
_LK_NBRLCK Mesmo que _LK_NBLCK.
_LK_RLCK Mesmo que _LK_LOCK.
_LK_UNLCK Desbloqueia os bytes especificados, que devem ter sido bloqueados anteriormente.

Várias regiões de um arquivo que não se sobrepõem podem ser bloqueadas. Uma região que está sendo desbloqueada deve ter sido bloqueada anteriormente. _locking não mescla regiões adjacentes; Se duas regiões bloqueadas forem adjacentes, cada região deverá ser desbloqueada separadamente. Regiões devem ser bloqueadas por um curto período de tempo e devem ser desbloqueadas antes de fechar um arquivo ou sair do programa.

Por padrão, o estado global dessa função tem como escopo o aplicativo. Para alterar esse comportamento, confira Estado global no CRT.

Requisitos

Rotina Cabeçalho necessário Cabeçalho opcional
_locking <io.h> e <sys/locking.h> <errno.h>

Para obter informações sobre compatibilidade, consulte Compatibilidade.

Bibliotecas

Todas as versões das bibliotecas em tempo de execução C.

Exemplo

// 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.

Saída de exemplo

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

Confira também

Manipulação de arquivos
_creat, _wcreat
_open, _wopen