Udostępnij za pośrednictwem


_locking

Blokuje lub odblokuje bajty pliku.

Składnia

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

Parametry

fd
Deskryptor plików.

mode
Blokowanie akcji do wykonania.

nbytes
Liczba bajtów do zablokowania.

Wartość zwracana

_locking Zwraca wartość 0, jeśli operacja się powiedzie. Wartość zwracana -1 wskazuje błąd, w którym przypadku errno ustawiono jedną z następujących wartości.

errno wartość Stan
EACCES Naruszenie blokady (plik jest już zablokowany lub odblokowany).
EBADF Nieprawidłowy deskryptor plików.
EDEADLOCK Naruszenie blokady. Zwracany po określeniu flagi _LK_LOCK lub _LK_RLCK i nie można zablokować pliku po 10 próbach.
EINVAL Podano nieprawidłowy argument funkcji _locking.

Jeśli błąd jest spowodowany nieprawidłowym parametrem, takim jak nieprawidłowy deskryptor pliku, wywoływana jest nieprawidłowa procedura obsługi parametrów, zgodnie z opisem w temacie Weryfikacja parametrów.

Uwagi

Funkcja _locking blokuje lub odblokuje nbytes bajty pliku określonego przez fd. Blokowanie bajtów w pliku uniemożliwia dostęp do tych bajtów przez inne procesy. Wszystkie blokowanie lub odblokowywanie rozpoczyna się od bieżącej pozycji wskaźnika pliku i przechodzi do następnych nbytes bajtów. Istnieje możliwość zablokowania bajtów poza końcem pliku.

mode musi być jedną z następujących stałych manifestu, które są zdefiniowane w pliku Locking.h.

mode wartość Efekt
_LK_LOCK Blokuje określone bajty. Jeśli nie można zablokować bajtów, program natychmiast spróbuje ponownie po 1 sekundzie. Jeśli bajty nie mogą być zablokowane po 10 próbach, stała zwraca błąd.
_LK_NBLCK Blokuje określone bajty. Jeśli nie można zablokować bajtów, stała zwraca błąd.
_LK_NBRLCK Tak samo jak _LK_NBLCK.
_LK_RLCK Tak samo jak _LK_LOCK.
_LK_UNLCK Odblokowuje określone bajty, które muszą być wcześniej zablokowane.

Można zablokować wiele regionów pliku, które nie nakładają się na siebie. Odblokowany region musi być wcześniej zablokowany. _locking nie scala sąsiednich regionów; Jeśli sąsiadują dwa zablokowane regiony, każdy region musi być odblokowany oddzielnie. Regiony powinny być zablokowane tylko na krótko i powinny zostać odblokowane przed zamknięciem pliku lub zamknięciem programu.

Domyślnie stan globalny tej funkcji jest zakresem aplikacji. Aby zmienić to zachowanie, zobacz Stan globalny w CRT.

Wymagania

Procedura Wymagany nagłówek Opcjonalny nagłówek
_locking <io.h> i <sys/locking.h> <errno.h>

Aby uzyskać więcej informacji o zgodności, zobacz Zgodność.

Biblioteki

Wszystkie wersje bibliotek czasu wykonywania języka C.

Przykład

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

Dane wejściowe: crt_locking.txt

The first thirty bytes of this file will be locked.

Przykładowe dane wyjściowe

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

Zobacz też

Obsługa plików
_creat, _wcreat
_open, _wopen