Condividi tramite


_locking

Blocca o sblocca i byte di un file.

Sintassi

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

Parametri

fd
Descrittore di file.

mode
Azione di blocco da eseguire.

nbytes
Numero di byte da bloccare.

Valore restituito

_locking restituisce 0 in caso di esito positivo. Il valore restituito -1 indica un errore, nel qual caso errno viene impostato su uno dei valori seguenti.

Valore errno Condizione
EACCES Violazione del blocco (file già bloccato o sbloccato).
EBADF Descrittore di file non valido.
EDEADLOCK Violazione di blocco. Restituito quando viene specificato il _LK_LOCK flag o _LK_RLCK e il file non può essere bloccato dopo 10 tentativi.
EINVAL Argomento non valido passato a _locking.

Se l'errore è dovuto a un parametro non valido, ad esempio un descrittore di file non valido, viene richiamato il gestore di parametri non validi, come descritto in Convalida dei parametri.

Osservazioni:

La _locking funzione blocca o sblocca i nbytes byte del file specificato da fd. Il blocco di byte in un file impedisce l'accesso a tali byte da altri processi. Tutto il blocco o lo sblocco inizia nella posizione corrente del puntatore al file e procede per i byte successivi nbytes . È possibile bloccare i byte oltre la fine del file.

mode deve essere una delle costanti manifesto seguenti, definite in Locking.h.

Valore mode Effetto
_LK_LOCK Blocca i byte specificati. Se i byte non possono essere bloccati, il programma prova immediatamente dopo 1 secondo. Se i byte non possono essere bloccati dopo 10 tentativi, la costante restituisce un errore.
_LK_NBLCK Blocca i byte specificati. Se i byte non possono essere bloccati, la costante restituisce un errore.
_LK_NBRLCK Uguale a _LK_NBLCK.
_LK_RLCK Uguale a _LK_LOCK.
_LK_UNLCK Sblocca i byte specificati, che devono essere stati bloccati in precedenza.

È possibile bloccare più aree di un file che non si sovrappongono. Un'area da sbloccare deve essere stata bloccata in precedenza. _locking non unisce aree adiacenti; se due aree bloccate sono adiacenti, ogni area deve essere sbloccata separatamente. Le aree devono essere bloccate solo brevemente e devono essere sbloccate prima di chiudere un file o di uscire dal programma.

Per impostazione predefinita, lo stato globale di questa funzione è limitato all'applicazione. Per modificare questo comportamento, vedere Stato globale in CRT.

Requisiti

Ciclo Intestazione obbligatoria Intestazione facoltativa
_locking <io.h> e <sys/locking.h> <errno.h>

Per altre informazioni sulla compatibilità, vedere Compatibility (Compatibilità).

Librerie

Tutte le versioni delle librerie di runtime C.

Esempio

// 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 );
}

Input: crt_locking.txt

The first thirty bytes of this file will be locked.

Output di esempio

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

Vedi anche

Gestione dei file
_creat, _wcreat
_open, _wopen