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
#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
#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ü
volatile ____ flag = 0;
volatile sig_atomic_t flag = 0;
Açıklama: sig_atomic_t, işleyicide bölünmez bayrak için kullanılır.