CodeBlanks Logo Icon CodeBlanks

Kilit türleri

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

Paylaşımlı ve ayrıcalıklı kilitler arasındaki farkı öğrenirsin.

Paylaşımlı ve ayrıcalıklı

İki temel kilit türü vardır. Paylaşımlı kilit (LOCK_SH veya F_RDLCK) birden çok okuyucuya izin verir; hiçbir yazıcı yokken alınabilir. Ayrıcalıklı kilit (LOCK_EX veya F_WRLCK) tek sahiplik verir; başka hiçbir kilit yokken alınır.

Okurken paylaşımlı, yazarken ayrıcalıklı kilit alırsın. Bu ilke, okuyucuların tutarsız veri görmesini önler. Eğer aynı süreç hem okuyup hem yazacaksa ayrıcalıklı kilit yeterlidir. Kilit dönüşümü yapabilirsin: önce LOCK_SH alıp sonra LOCK_EX'e yükseltirsin; bu sırada LOCK_UN ile arada bırakmak en güvenli yoldur.

Kilit yükseltme

Bazen önce okur, sonra yazarız. Bu durumda önce LOCK_SH alıp sonra LOCK_EX'e yükseltmek isteyebilirsin. Doğrudan dönüşüm bazı sistemlerde bekleyebilir; en güvenli yol LOCK_UN ile bırakıp sonra LOCK_EX almaktır.

Test için sırayla her iki kilit türünü alıp bırakabilirsin: flock(fd, LOCK_SH); printf("shared\n"); flock(fd, LOCK_UN); flock(fd, LOCK_EX); printf("exclusive\n"); flock(fd, LOCK_UN);. Bu, paylaşımlı ve ayrıcalıklı kilitlerin nasıl çalıştığını net gösterir.

Uygulama İki kilit türünü dene

int fd = open("/tmp/cb_types.txt", O_CREAT | O_RDWR, 0644); ile dosya aç. flock(fd, LOCK_SH);, printf("shared\n");, flock(fd, LOCK_UN);. Sonra flock(fd, LOCK_EX);, printf("exclusive\n");, flock(fd, LOCK_UN);. close(fd); ve unlink("/tmp/cb_types.txt");.

Başlangıç kodu

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

// dosyayı aç
// paylaşımlı kilit al, yazdır, bırak
// ayrıcalıklı kilit al, yazdır, bırak, 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_types.txt", O_CREAT | O_RDWR, 0644);
    flock(fd, LOCK_SH);
    printf("shared\n");
    flock(fd, LOCK_UN);
    flock(fd, LOCK_EX);
    printf("exclusive\n");
    flock(fd, LOCK_UN);
    close(fd);
    unlink("/tmp/cb_types.txt");
    return 0;
}

Beklenen çıktı

shared
exclusive

Soru ve cevaplar

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

1 Paylaşımlı kilit

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

Açıklama: LOCK_SH paylaşımlı kilit alır; okuma için uygundur.

2 Kilit türlerini eşle

Kavram Anlamı
LOCK_SH Çok okuyucu
LOCK_EX Tek yazıcı
F_RDLCK Okuma kilidi
F_WRLCK Yazma kilidi

3 Bir dosyaya yazarken hangi kilit alınmalı?

  • Paylaşımlı kilit
  • Kilitsiz erişim
  • Ayrıcalıklı kilit Doğru cevap
  • Sadece okuma kilidi

Açıklama: Yazma için ayrıcalıklı kilit (LOCK_EX) alınır.

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