Aracılığıyla paylaş


_locking

Bir dosyanın baytlarını kilitler veya kilidini açar.

Sözdizimi

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

Parametreler

fd
Dosya tanımlayıcısı.

mode
Gerçekleştirilecek kilitleme eylemi.

nbytes
Kilitlenecek bayt sayısı.

Dönüş değeri

_locking başarılı olursa 0 döndürür. -1 dönüş değeri hata olduğunu gösterir ve bu durumda errno aşağıdaki değerlerden birine ayarlanır.

errno Değer Koşul
EACCES Kilitleme ihlali (dosya zaten kilitli veya kilidi açık).
EBADF Geçersiz dosya tanımlayıcısı.
EDEADLOCK Kilit ihlali. veya _LK_RLCK bayrağı belirtildiğinde _LK_LOCK döndürülür ve 10 denemeden sonra dosya kilitlenemez.
EINVAL öğesine _lockinggeçersiz bir bağımsız değişken verildi.

Hata, geçersiz bir dosya tanımlayıcısı gibi hatalı bir parametreden kaynaklanıyorsa, parametre doğrulamasında açıklandığı gibi geçersiz parametre işleyicisi çağrılır.

Açıklamalar

_locking işlevi tarafından fdbelirtilen dosyanın baytlarını kilitler nbytes veya kilidini açar. Bir dosyadaki baytların kilitlenmesi, diğer işlemler tarafından bu baytlara erişimi engeller. Tüm kilitleme veya kilit açma işlemleri dosya işaretçisinin geçerli konumunda başlar ve sonraki nbytes baytlar için devam eder. Dosyanın sonundan sonra baytları kilitlemek mümkündür.

mode , Locking.h içinde tanımlanan aşağıdaki bildirim sabitlerinden biri olmalıdır.

mode Değer Etki
_LK_LOCK Belirtilen baytları kilitler. Baytlar kilitlenemiyorsa, program 1 saniye sonra hemen yeniden dener. Baytlar 10 denemeden sonra kilitlenemiyorsa, sabit bir hata döndürür.
_LK_NBLCK Belirtilen baytları kilitler. Baytlar kilitlenemiyorsa sabit bir hata döndürür.
_LK_NBRLCK ile _LK_NBLCKaynı.
_LK_RLCK ile _LK_LOCKaynı.
_LK_UNLCK Daha önce kilitlenmiş olması gereken belirtilen baytların kilidini açar.

Bir dosyanın örtüşmeyen birden çok bölgesi kilitlenebilir. Kilidi açılmış bir bölge daha önce kilitlenmiş olmalıdır. _locking bitişik bölgeleri birleştirmez; iki kilitli bölge bitişikse, her bölgenin kilidi ayrı olarak açılmalıdır. Bölgeler yalnızca kısa bir süre kilitli olmalı ve bir dosyayı kapatmadan veya programdan çıkmadan önce kilidi açılmalıdır.

Varsayılan olarak, bu işlevin genel durumunun kapsamı uygulama olarak belirlenmiştir. Bu davranışı değiştirmek için bkz. CRT'de Genel durum.

Gereksinimler

Yordam Gerekli başlık İsteğe bağlı üst bilgi
_locking <io.h> ve <sys/locking.h> <errno.h>

Daha fazla uyumluluk bilgisi için bkz . Uyumluluk.

Kitaplıklar

C çalışma zamanı kitaplıklarının tüm sürümleri.

Örnek

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

Giriş: crt_locking.txt

The first thirty bytes of this file will be locked.

Örnek çıktı

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

Ayrıca bkz.

Dosya işleme
_creat, _wcreat
_open, _wopen