Otomatik kilit temizleme
- C kursu
- İleri seviye
- Ders 41/83
- 5 dk
Otomatik kilit temizleme ve güvenlik öğrenirsin.
Otomatik temizlik
Kilitlerin otomatik temizlenmesi güvenliği artırır. flock için close(fd) çağrısı kilidi anında bırakır; fcntl için de aynı geçerlidir. Bu yüzden close çağrısını erken yapmak, kilit sızıntısını önler.
Program beklenmedik şekilde sonlanırsa kernel tüm tanıtıcıları kapatır ve kilitler bırakılır. Yine de atexit(cleanup) ile çıkışta çalışacak bir temizlik fonksiyonu kaydetmek iyi bir alışkanlıktır. Bu fonksiyon close, unlink ve diğer temizlik işlerini yapar. Böylece program normal veya hatalı çıksa da kaynak sızıntısı olmaz.
atexit ile çıkış temizliği
atexit, <stdlib.h> başlığında tanımlıdır. Program normal çıkarken kaydedilen fonksiyonları çağırır. void cleanup(void) imzasıyla bir fonksiyon tanımlayıp atexit(cleanup) ile kaydedersin.
Test için basit bir senaryo: dosya aç, flock(fd, LOCK_EX) al, printf("kilitlendi\n") yazdır, close(fd) ile kilidi bırak, printf("temizlendi\n") yazdır. atexit burada çağrılmadan da temizlik olur; ama gerçek uygulamada programın herhangi bir yerinden return veya exit yapıldığında temizlik fonksiyonu devreye girer.
Uygulama Otomatik temizlik göster
int fd = open("/tmp/cb_clean.txt", O_CREAT | O_RDWR, 0644); ile dosya aç. flock(fd, LOCK_EX); ve printf("kilitlendi\n");. close(fd); ile kilidi otomatik bırak. printf("temizlendi\n");. unlink("/tmp/cb_clean.txt");.
Başlangıç kodu
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/file.h>
// dosyayı aç ve kilit al
// close ile kilidi bırak
// temizlendi yazdır ve dosyayı 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_clean.txt", O_CREAT | O_RDWR, 0644);
flock(fd, LOCK_EX);
printf("kilitlendi\n");
close(fd);
printf("temizlendi\n");
unlink("/tmp/cb_clean.txt");
return 0;
}Beklenen çıktı
kilitlendi temizlendi
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Temizlik mekanizmalarını eşle
| Kavram | Anlamı |
|---|---|
close |
Kilidi bırakır |
atexit |
Çıkış fonksiyonu |
unlink |
Dosyayı siler |
kernel |
Çöküşte temizler |
2 close(fd) çağrısı flock kilidine ne yapar?
- Otomatik bırakır Doğru cevap
- Kalıcı yapar
- Hiçbir şey
- Çoğaltır
Açıklama: close(fd) flock kilidini otomatik bırakır.
3 atexit çağrısı
atexit(____);
atexit(cleanup);
Açıklama: atexit, cleanup fonksiyonunu çıkışta çalıştırır.