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