CodeBlanks Logo Icon CodeBlanks

fcntl

  • C kursu
  • İleri seviye
  • Ders 38/83
  • 5 dk

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");.

Başlangıç kodu

main.c
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>

// dosyayı aç
// kilit yapısını doldur ve kilit kur
// dönüş değerini yazdır, sonra kilidi aç

int main(void) {
    return 0;
}

Örnek çözüm

main.c
#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;
}

Beklenen çıktı

fcntl: 0

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 fcntl parçalarını eşle

Kavram Anlamı
F_SETLK Kilit kurar
F_WRLCK Yazma kilidi
F_UNLCK Kilidi açar
struct flock Kilit yapısı

2 struct flock'ta l_len = 0 ne anlama gelir?

  • Sıfır bayt kilit
  • Dosya sonuna kadar kilit Doğru cevap
  • Hemen hata döner
  • Yalnızca ilk bayt

Açıklama: l_len = 0 dosya sonuna kadar kilit anlamına gelir.

3 fcntl çağrısı

Soru
fcntl(fd, ____, &fl);
Cevap
fcntl(fd, F_SETLK, &fl);

Açıklama: F_SETLK kilit kurar; çakışırsa hata döner.

İleri seviye bölümündeki tüm dersler