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
#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
#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
flock(fd, ____);
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.