Sinyal Yığıtı
Önceki XXIV. Oylum - Sinyal İşleme Sonraki
Sinyal Yığıtı
Bir sinyal yığıtı, sinyal eylemcilerin icra yığıtı olarak kullanılan özel bir bellek alanıdır. Taşmalardan kaçınmak için oldukça büyük olmalıdır; boyutunu belirlemek amacıyla SIGSTKSZ makrosu tanımlanmıştır. Yığıt için gereken alanı malloc ile ayırabilirsiniz. Bundan sonra yapacağınız bir sigaltstack veya sigstack çağrısı ile sisteme bu alanın sinyal yığıtı olarak kullanılacağını belirtebilirsiniz.
Sinyal yığıtını kullanmaları için sinyal eylemcileri oluştururken farklı bir şey yapmanız gerekmez. Bir yığıttan diğerine geçilmesi özdevinimli gerçekleşir. (GNU hata ayıklayıcıları dışındaki bazı hata ayıklayıcılar bazı makinelerde bir sinyal eylemcisinin sinyal yığıtını kullandığı durumda yığıt izlemesini başarıyla yapamayabilir.)
Sisteme ayrı bir sinyal yığıtı kullanmasını belirtmenin iki yolu vardır. 4.2 BSD ile gelen sigstack biraz eski bir arayüzdür. 4.4 BSD ile gelen sigaltstack daha yenidir. sigaltstack işlevinin bir getirisi vardır; makineye ve işletim sistemine bağlı olan yığıt büyümesinin yönü ile ilgilenmek zorunda kalmazsınız.
stack_t
veri türü
Bu veri yapısı bir sinyal yığıtı hakkında bilgi içerir. Aşağıdaki üyelere sahiptir:
void *ss_sp
Sinyal yığıtının taban adresidir.
size_t ss_size
ss_sp'den başlayan sinyal yığıtının boyutudur. Yığıt için ne kadar yer ayrılacağını bu üye ile belirteceksiniz.
Yığıt için gereken alanı hesaplamak için signal.h dosyasında tanımlanmış iki makro vardır:
SIGSTKSZ
Bu bir sinyal yığıtı için olması gereken boyuttur. Normal kullanımlar için yeterli olabilecek kadardır.
MINSIGSTKSZ
İşletim sisteminin sinyal göndermeyi gerçekleştirebileceği sinyal yığıtı boyutudur. Ayıracağınız sinyal yığıtı boyutu bu değerden BÜYÜK olmalıdır.
Çoğu durumda, ss_size için SIGSTKSZ kullanmak yeterlidir. Ama yazılımınızın sinyal eylemcilerinin ne kadar yığıt alanı kullanacaklarını biliyorsanız, bundan farklı bir değer de kullanabilirsiniz. Bu durumda en az MINSIGSTKSZ yer ayırmanız gerekir, ss_size ile bu değerden büyük herhangi bir değeri atayabilirsiniz.
int ss_flags
Bu üye şu seçeneklerin bit bit veyalanmış değerini içerir:
SS_DISABLE
Sistemin sinyal yığıtını kullanmaMAsını belirtir.
SS_ONSTACK
Sistem tarafından atanır ve sinyal yığıtının o an kullanılmakta olduğunu belirtir. Bu bit etkin değilse sinyaller, normal kullanıcı yığıtını kullanıyor demektir.
int sigaltstack
(const stack_t *restrict yığıt,
 stack_t *restrict       eski_yığıt)
işlev
sigaltstack işlevi, sinyal eylemcilerin ayrı bir sinyal yığıtı kullanacağını belirtir. Süreç tarafından bir sinyal alındığında sinyalin eyleminin sinyal yığıtı üzerinden işlenecekse, sistem, sinyal eylemcinin çalışırken bu sinyal yığıtının kullanılması için gerekli düzenlemeyi yapar.
eski_yığıt bir boş gösterici değilse, kurulu sinyal yığıtının bilgileri bu adreste döndürülür. yığıt bir boş gösterici değilse, bu, sinyal eylemciler tarafından kullanılacak yeni yığıtı belirtir.
İşlev başarılı olduğunda 0 ile döner, aksi takdirde -1 ile döner. Aşağıdaki errno değerleri bu işlev için tanımlanmıştır:
EINVAL
Kullanımda olan bir yığıtı iptal etmeye çalıştınız.
ENOMEM
Yeni yığıtın boyu MINSIGSTKSZ değerinden küçük.
Burada eski arayüz olan sigstack işlevini de anlatacağız ancak, sistem bu işlevi içerse bile bunun yerine sigaltstack işlevini kullanmalısınız.
struct sigstack
veri türü
Bu veri yapısı bir sinyal yığıtı hakkında bilgi içerir. Şu üyelere sahiptir:
void *ss_sp
Yığıt göstericisidir. Yığıt aşağı doğru büyüyorsa bu değer yığıtın tepesini, yukarı doğru büyüyorsa yığıtın altını gösterir.
int ss_onstack
Sistem o an bu yığıtı kullanıyorsa bu alanın değeri "doğru"dur.
int sigstack
(const struct sigstack *yığıt,
 struct sigstack       *eski_yığıt)
işlev
sigstack işlevi, sinyal eylemcilerin ayrı bir sinyal yığıtı kullanacağını belirtir. Süreç tarafından bir sinyal alındığında sinyalin eyleminin sinyal yığıtı üzerinden işlenecekse, sistem, sinyal eylemcinin çalışırken bu sinyal yığıtının kullanılması için gerekli düzenlemeyi yapar.
eski_yığıt bir boş gösterici değilse, kurulu sinyal yığıtının bilgileri bu adreste döndürülür. yığıt bir boş gösterici değilse, bu, sinyal eylemciler tarafından kullanılacak yeni yığıtı belirtir.
İşlev başarılı olduğunda 0 ile döner, aksi takdirde -1 ile döner.
Önceki Üst Ana Başlık Sonraki
sigsuspend Kullanımı Başlangıç BSD Usulü Sinyal İşleme
Bir Linux Kitaplığı Sayfası