_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