_locking
Blocca o sblocca i byte di un file.
int _locking(
int fd,
int mode,
long nbytes
);
Parametri
fd
Descrittore di filemode
Azione di blocco da eseguire.nbytes
Numero di byte da bloccare.
Valore restituito
_locking restituisce 0 in caso di esito positivo. Un valore restituito pari a –1 indica un errore, in questo caso errno viene impostato su uno dei seguenti valori.
EACCES
Violazione di blocco (file già bloccato o sbloccato).EBADF
Descrittore di file non valido.EDEADLOCK
Violazione di blocco. Restituito quando viene specificato il flag _LK_RLCK o _LK_LOCK e non è stato possibile bloccare il file dopo 10 tentativi.EINVAL
È stato fornito un argomento non valido a _locking.
Se l'errore è causato da un parametro non valido, ad esempio un descrittore di file non valido, viene richiamato il gestore di parametro non valido, come descritto in Convalida dei parametri.
Note
La funzione _locking blocca o sblocca nbytes byte del file a cui fa riferimento fd. Il blocco dei byte in un file impedisce l'accesso a questi byte da parte di altri processi. Tutte le operazioni di blocco e sblocco iniziano dalla posizione corrente del puntatore a file e continuano per i seguenti nbytes byte. È possibile bloccare byte oltre la fine del file.
mode deve essere una delle seguenti costanti manifesto, definite in Locking.h.
_LK_LOCK
Blocca i byte specificati. Se i byte non possono essere bloccati, il programma tenterà di bloccarli nuovamente dopo 1 secondo. Se, dopo 10 tentativi, i byte non possono essere bloccati, 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 precedentemente.
Più aree di un file che non si sovrappongono possono essere bloccate. Un'area che viene sbloccata deve essere stata bloccata precedentemente. _locking non esegue il merge delle aree adiacenti; se due aree bloccate sono adiacenti, ogni area deve essere sbloccata separatamente. Le aree dovrebbero essere bloccate solo brevemente e dovrebbero essere sbloccate prima di chiudere un file o prima di uscire dal programma.
Requisiti
Routine |
Intestazione obbligatoria |
Intestazione facoltativa |
---|---|---|
_locking |
<io.h> and <sys/locking.h> |
<errno.h> |
Per ulteriori informazioni sulla compatibilità, vedere Compatibilità nell'introduzione.
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.
Esempio di output
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