CodeBlanks Logo Icon CodeBlanks

flock

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

flock ile dosya kilidi öğrenirsin.

flock nedir?

flock, BSD kökenli basit bir dosya kilitleme çağrısıdır. Tüm dosyayı kilitler; bayt aralığı desteklemez. flock(fd, operation) çağrısı <sys/file.h> başlığında tanımlıdır. Üç temel işlem vardır: LOCK_SH paylaşımlı, LOCK_EX ayrıcalıklı, LOCK_UN kilidi açma.

Paylaşımlı kilit okuma, ayrıcalıklı kilit yazma içindir. flock önermelidir: işbirliği yapan süreçler kilidi sayar, ama saymayan süreçleri durdurmaz. LOCK_NB ile birleştirildiğinde kilit alınamazsa çağrı beklemez. Kilitler dosya tanıtıcıyla ilişkilidir; close(fd) kilidi otomatik bırakır.

Aç, kilitle, bırak, kapat

Tipik akış şudur: open(path, O_CREAT | O_RDWR, 0644) ile dosyayı aç, flock(fd, LOCK_EX) ile kilit al, işle, flock(fd, LOCK_UN) ile bırak, son olarak close(fd) ile kapat. Kapatma kilidi de serbest bırakır.

Test için printf("kilitlendi\n") ve printf("açıldı\n") ile durumu yazdırabilirsin. unlink(path) çağrısı dosyayı siler; böylece tekrar çalıştırılınca kalıntı kalmaz. Hata denetimi if (flock(fd, LOCK_EX) == -1) ile yapılır.

Uygulama Dosya kilitle ve bırak

int fd = open("/tmp/cb_lock.txt", O_CREAT | O_RDWR, 0644); ile dosya aç. flock(fd, LOCK_EX); ile kilit al ve printf("kilitlendi\n");. flock(fd, LOCK_UN); ile bırak ve printf("açıldı\n");. close(fd); ve unlink("/tmp/cb_lock.txt");.

Başlangıç kodu

main.c
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/file.h>

// dosyayı aç
// kilit al ve yazdır
// kilidi bırak ve yazdır, sonra kapat ve sil

int main(void) {
    return 0;
}

Örnek çözüm

main.c
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/file.h>

int main(void) {
    int fd = open("/tmp/cb_lock.txt", O_CREAT | O_RDWR, 0644);
    flock(fd, LOCK_EX);
    printf("kilitlendi\n");
    flock(fd, LOCK_UN);
    printf("açıldı\n");
    close(fd);
    unlink("/tmp/cb_lock.txt");
    return 0;
}

Beklenen çıktı

kilitlendi
açıldı

Soru ve cevaplar

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

1 flock(fd, LOCK_EX) ne yapar?

  • Ayrıcalıklı kilit alır Doğru cevap
  • Paylaşımlı kilit alır
  • Kilidi açar
  • Dosyayı siler

Açıklama: LOCK_EX ayrıcalıklı kilit alır; yazma için kullanılır.

2 flock çağrısı

Soru
flock(fd, ____);
Cevap
flock(fd, LOCK_EX);

Açıklama: LOCK_EX ayrıcalıklı kilit alır.

3 flock sabitlerini eşle

Kavram Anlamı
LOCK_SH Paylaşımlı
LOCK_EX Ayrıcalıklı
LOCK_UN Kilidi açar
LOCK_NB Beklemez

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