CodeBlanks Logo Icon CodeBlanks

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

main.c
#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

main.c
#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ı

Soru
atexit(____);
Cevap
atexit(cleanup);

Açıklama: atexit, cleanup fonksiyonunu çıkışta çalıştırır.

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