CodeBlanks Logo Icon CodeBlanks

Sinyal güvenliği

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

Sinyal güvenliği ve yeniden girilebilir fonksiyonları öğrenirsin.

Sinyal güvenliği

Sinyal işleyici, programın herhangi bir noktasında keser. Bu yüzden işleyici içinde yalnızca yeniden girilebilir (reentrant) işlevler çağrılmalıdır.

malloc, printf, fopen gibi işlevler yeniden girilebilir değildir; çünkü iç statik durum tutarlar. İşleyicide write ve _exit güvenlidir. Bayrak değişkeni için volatile sig_atomic_t kullanırsın; bu türün okuma ve yazması bölünmez.

volatile sig_atomic_t

volatile, derleyiciye değişkenin optimizasyon yapılmadan her erişimde bellekten okunmasını söyler. sig_atomic_t ise bölünmez okuma ve yazma garantili türdür.

İşleyici bir bayrak ayarlar, ana döngü bu bayrağı denetler ve tepki verir. Bu, sinyal güvenli iletişimin temel desenidir. Örneğin volatile sig_atomic_t flag = 0; tanımlayıp işleyicide flag = 1; yaparsın. Ana kod while (!flag) ile bekler.

Uygulama Güvenli bayrak

volatile sig_atomic_t flag = 0; tanımla. void handler(int sig) yaz; içinde flag = 1;. signal(SIGUSR1, handler); ile kaydet. raise(SIGUSR1); ve printf("flag=%d\n", flag); ile yazdır.

Başlangıç kodu

main.c
#include <stdio.h>
#include <signal.h>
#include <unistd.h>

// bayrak değişkenini tanımla
// handler yaz
// signal ile kaydet, raise ile gönder
// bayrağı yazdır

int main(void) {
    return 0;
}

Örnek çözüm

main.c
#include <stdio.h>
#include <signal.h>
#include <unistd.h>

volatile sig_atomic_t flag = 0;

void handler(int sig) {
    flag = 1;
}

int main(void) {
    signal(SIGUSR1, handler);
    raise(SIGUSR1);
    printf("flag=%d\n", flag);
    return 0;
}

Beklenen çıktı

flag=1

Soru ve cevaplar

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

1 Güvenlik kavramlarını eşle

Kavram Anlamı
volatile Optimizasyonu önler
sig_atomic_t Bölünmez tür
write Güvenli işlev
malloc Güvenli değil

2 Sinyal işleyicide hangi işlev güvenlidir?

  • write Doğru cevap
  • printf
  • malloc
  • fopen

Açıklama: write yeniden girilebilir bir sistem çağrısıdır.

3 Bayrak türü

Soru
volatile ____ flag = 0;
Cevap
volatile sig_atomic_t flag = 0;

Açıklama: sig_atomic_t, işleyicide bölünmez bayrak için kullanılır.

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