_locking
Uzamkne nebo odemkne bajty souboru.
Syntaxe
int _locking(
int fd,
int mode,
long nbytes
);
Parametry
fd
Popisovač souboru
mode
Akce uzamčení, která se má provést.
nbytes
Počet bajtů, které se mají zamknout
Vrácená hodnota
_locking
vrátí hodnotu 0, pokud je úspěšná. Návratová hodnota -1 označuje selhání, v takovém případě errno
je nastavená na jednu z následujících hodnot.
errno hodnota |
Podmínka |
---|---|
EACCES |
Narušení uzamčení (soubor je již uzamčen nebo odemknutý). |
EBADF |
Neplatný popisovač souboru |
EDEADLOCK |
Narušení uzamykání. Vráceno, když _LK_LOCK je zadán příznak nebo _LK_RLCK příznak a soubor nelze uzamknout po 10 pokusech. |
EINVAL |
Byl udělen _locking neplatný argument . |
Pokud příčinou selhání je chybný parametr, například neplatný popisovač souboru, vyvolá se neplatná obslužná rutina parametru, jak je popsáno v ověření parametru.
Poznámky
Funkce _locking
uzamkne nebo odemkne nbytes
bajty souboru určeného uživatelem fd
. Uzamčení bajtů v souboru brání přístupu k těmto bajtům jinými procesy. Všechny uzamykání nebo odemykání začínají na aktuální pozici ukazatele souboru a pokračuje pro další nbytes
bajty. Zamknout bajty po konci souboru je možné.
mode
musí být jedna z následujících konstant manifestu, které jsou definovány v Locking.h.
mode hodnota |
Účinnost |
---|---|
_LK_LOCK |
Uzamkne zadané bajty. Pokud bajty nelze uzamknout, program se okamžitě pokusí znovu po 1 sekundě. Pokud bajty nelze po 10 pokusech uzamknout, vrátí konstanta chybu. |
_LK_NBLCK |
Uzamkne zadané bajty. Pokud bajty nelze uzamknout, vrátí konstanta chybu. |
_LK_NBRLCK |
Stejné jako _LK_NBLCK . |
_LK_RLCK |
Stejné jako _LK_LOCK . |
_LK_UNLCK |
Odemkne zadané bajty, které musely být dříve uzamčeny. |
Více oblastí souboru, které se nepřekrývají, je možné uzamknout. Oblast, která je odemknutá, musí být dříve uzamčená. _locking
nesloučí sousední oblasti; pokud jsou dvě uzamčené oblasti sousední, musí být každá oblast odemknutá samostatně. Oblasti by měly být uzamčeny pouze krátce a měly by být odemknuté před zavřením souboru nebo ukončením programu.
Ve výchozím nastavení je globální stav této funkce vymezen na aplikaci. Chcete-li toto chování změnit, přečtěte si téma Globální stav v CRT.
Požadavky
Rutina | Požadovaný hlavičkový soubor | Volitelné záhlaví |
---|---|---|
_locking |
<io.h> a <sys/locking.h> | <errno.h> |
Další informace o kompatibilitě najdete v tématu Kompatibilita.
Knihovny
Všechny verze knihoven runtime jazyka C.
Příklad
// 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 );
}
Vstup: crt_locking.txt
The first thirty bytes of this file will be locked.
Ukázkový výstup
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