signal handler
- C kursu
- İleri seviye
- Ders 14/83
- 5 dk
signal fonksiyonu ile sinyal yakalamayı öğrenirsin.
signal işlevi
signal(sig, handler), bir sinyal için işleyici kaydeder. handler, sinyal numarası alan ve void döndüren bir işlevin işaretçisidir.
Örneğin signal(SIGUSR1, handler), SIGUSR1 geldiğinde handler işlevini çağırır. İşleyici içinde yalnızca güvenli işlemler yapmalısın; çünkü sinyal her an gelebilir. signal basittir ama davranışı sistemler arası değişir; üretim kodunda sigaction tercih edilir.
raise ile sinyal gönderme
raise(sig), çağıran sürece sig sinyalını gönderir. kill(getpid(), sig) ile aynı etkiyi yapar.
İşleyici, sinyal geldiğinde sürecin normal akışını keser ve çağrılır. İşleyici dönünce süreç kaldığı yerden devam eder. raise eşzamanlıdır: çağrı, işleyici dönene kadar bekler. Bu yüzden raise(SIGUSR1)'den sonraki satır, işleyici bittikten sonra çalışır. Test için idealdir.
Uygulama Sinyal yakala
int caught = 0; global değişkeni tanımla. void handler(int sig) yaz; içinde caught = 1;. signal(SIGUSR1, handler); ile kaydet. raise(SIGUSR1); ile gönder ve printf("yakalandı=%d\n", caught); ile yazdır.
Başlangıç kodu
#include <stdio.h>
#include <signal.h>
int caught = 0;
// handler işlevini yaz
// signal ile kaydet
// raise ile gönder ve yazdır
int main(void) {
return 0;
}Örnek çözüm
#include <stdio.h>
#include <signal.h>
int caught = 0;
void handler(int sig) {
caught = 1;
}
int main(void) {
signal(SIGUSR1, handler);
raise(SIGUSR1);
printf("yakalandı=%d\n", caught);
return 0;
}Beklenen çıktı
yakalandı=1
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 İşleyici kavramlarını eşle
| Kavram | Anlamı |
|---|---|
signal |
İşleyici kaydeder |
raise |
Kendine sinyal |
handler |
İşleyici işlev |
SIGUSR1 |
Kullanıcı sinyali |
2 raise(SIGUSR1) ne yapar?
- Başka sürece sinyal gönderir
- Çağırana sinyal gönderir Doğru cevap
- Sinyali yok sayar
- Sinyali engeller
Açıklama: raise, çağıran sürece sinyal gönderir.
3 İşleyici kaydı
signal(SIGUSR1, ____);
signal(SIGUSR1, handler);
Açıklama: handler işlevi SIGUSR1 için kaydedildi.