_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 _locking geç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 fd
belirtilen 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_NBLCK aynı. |
_LK_RLCK |
ile _LK_LOCK aynı. |
_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