Sdílet prostřednictvím


_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 _lockingneplatný 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

Viz také

Zpracování souborů
_creat, _wcreat
_open, _wopen