C
fcntl
fcntl ile gelişmiş dosya kilidi öğrenirsin.
fcntl kilidi
fcntl, POSIX'in bayt aralığı kilit aracıdır. struct flock yapısı kilitin türünü (l_type), başlangıcını (l_start), göreli konumu (l_whence) ve uzunluğunu (l_len) tanımlar. l_len = 0 dosya sonuna kadar kilitler.
fcntl(fd, F_SETLK, &fl) kilit alır; çakışırsa -1 döner. F_SETLKW bekleyen sürümdür. F_RDLCK okuma, F_WRLCK yazma, F_UNLCK açma kilididir. flock'tan farklı olarak fcntl süreç bazlıdır; aynı süreç tekrar kilit alabilir.
struct flock doldurma
Kilit almadan önce struct flock fl; yapısını doldurmalısın. fl.l_type = F_WRLCK;, fl.l_whence = SEEK_SET;, fl.l_start = 0; ve fl.l_len = 0; dosya başından sonuna kadar ayrıcalıklı kilit tanımlar.
int r = fcntl(fd, F_SETLK, &fl); çağrısı kilit alır; başarıda 0, çakışmada -1 döner. Test için dönüş değerini yazdırabilirsin: printf("fcntl: %d\n", r);. Açmak için fl.l_type = F_UNLCK; yapıp aynı çağrıyı tekrarlarsın. close(fd) tüm kilitleri otomatik bırakır.
Uygulama fcntl ile kilit al
int fd = open("/tmp/cb_fcntl.txt", O_CREAT | O_RDWR, 0644); ile dosya aç. struct flock fl; tanımla; fl.l_type = F_WRLCK;, fl.l_whence = SEEK_SET;, fl.l_start = 0;, fl.l_len = 0;. int r = fcntl(fd, F_SETLK, &fl); ve printf("fcntl: %d\n", r);. fl.l_type = F_UNLCK; ve tekrar fcntl(fd, F_SETLK, &fl);. close(fd); ve unlink("/tmp/cb_fcntl.txt");.
Örnek çözümü göster
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
int main(void) {
int fd = open("/tmp/cb_fcntl.txt", O_CREAT | O_RDWR, 0644);
struct flock fl;
fl.l_type = F_WRLCK;
fl.l_whence = SEEK_SET;
fl.l_start = 0;
fl.l_len = 0;
int r = fcntl(fd, F_SETLK, &fl);
printf("fcntl: %d\n", r);
fl.l_type = F_UNLCK;
fcntl(fd, F_SETLK, &fl);
close(fd);
unlink("/tmp/cb_fcntl.txt");
return 0;
}
Kendini test et
-
fcntl parçalarını eşle
- F_SETLK
- Kilit kurar
- F_WRLCK
- Yazma kilidi
- F_UNLCK
- Kilidi açar
- struct flock
- Kilit yapısı
-
struct flock'ta l_len = 0 ne anlama gelir?
- Sıfır bayt kilit
- Dosya sonuna kadar kilit
- Hemen hata döner
- Yalnızca ilk bayt
Cevabı göster
Dosya sonuna kadar kilit — l_len = 0 dosya sonuna kadar kilit anlamına gelir.
-
fcntl çağrısı
fcntl(fd, ____, &fl);
Cevabı göster
fcntl(fd, F_SETLK, &fl);
Sıradaki ders: Kilit türleri