sigaction
- C kursu
- İleri seviye
- Ders 15/83
- 5 dk
sigaction ile gelişmiş sinyal yönetimini öğrenirsin.
sigaction yapısı
sigaction, signal'ın modern ve taşınabilir alternatifidir. struct sigaction yapısı ile işleyici, maske ve bayrakları ayrı ayrı belirtirsin.
Önce struct sigaction sa; tanımla. sa.sa_handler = handler; ile işleyiciyi ata. sigemptyset(&sa.sa_mask) ile maskeyi boşalt. sa.sa_flags = 0; ile bayrakları sıfırla. Sonra sigaction(SIGUSR1, &sa, NULL) ile kaydet. Bu, signal'dan daha denetimli ve güvenlidir.
sa_flags ve maske
sa_flags, işleyicinin davranışını değiştirir. SA_RESTART sinyal kesilen sistem çağrılarını otomatik yeniden başlatır. SA_SIGINFO işleyiciye ek bilgi geçilmesini sağlar.
sa_mask, işleyici çalışırken engellenecek sinyaller kümesidir. sigemptyset ile boşaltırsan işleyici sırasında başka sinyal engellenmez. sigaddset ile belirli sinyalleri ekleyebilirsin. Bu denetim signal'da yoktur.
Uygulama sigaction ile yakala
int caught = 0; ve void handler(int sig) ile caught = 1;. struct sigaction sa; tanımla; sa.sa_handler = handler;, sigemptyset(&sa.sa_mask);, sa.sa_flags = 0;. sigaction(SIGUSR1, &sa, NULL); ile kaydet. raise(SIGUSR1); ve printf("yakalandı=%d\n", caught);.
Başlangıç kodu
#include <stdio.h>
#include <signal.h>
int caught = 0;
// handler işlevini yaz
// sigaction yapısı tanımla
// kaydet ve raise ile gönder
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) {
struct sigaction sa;
sa.sa_handler = handler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
sigaction(SIGUSR1, &sa, NULL);
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 sa_handler ataması
sa.sa_handler = ____;
sa.sa_handler = handler;
Açıklama: sa_handler, işleyici işlevine atanır.
2 sigaction alanlarını eşle
| Kavram | Anlamı |
|---|---|
sigaction |
Modern işleyici |
sa_handler |
İşleyici alanı |
sa_flags |
Bayrak alanı |
sigemptyset |
Maskeyi boşalt |
3 sigaction, signal'a göre ne avantaj sağlar?
- Daha hızlıdır
- Daha az kod gerektirir
- Daha denetimli ve taşınabilir Doğru cevap
- Sinyal numarasını değiştirir
Açıklama: sigaction daha denetimli ve sistemler arası tutarlıdır.