Basit Sinyal İşleme
Önceki Sinyal Eylemlerinin Belirtilmesi Sonraki
Basit Sinyal İşleme
signal işlevi, belirli bir sinyal için bir eylem oluşturmayı sağlayan basit bir arayüzdür. İşlevin ve bununla ilgili makroların bildirimleri signal.h başlık dosyasında bulunur.
sighandler_t
veri türü
Bu, sinyal yakalama işlevlerinin veri türüdür. Sinyal yakalama işlevleri sinyal numarasının belirtildiği tek bir argüman alırlar ve dönüş türleri void'dir. Böyle bir sinyal yakalama işlevi şöyle tanımlanmalıdır:
void eylemci (int sinyalnum) { … }
Bu veri türünün ismi olan sighandler_t bir GNU oluşumudur.
sighandler_t signal
(int          sinyalnum,
 sighandler_t eylem)
işlev
signal işlevi sinyalnum sinyali için eylem olarak eylem eylemini oluşturur.
İlk argüman olan sinyalnum, denetlenecek davranışın karşılığı olan sinyaldir ve bir sinyal numarası olarak belirtilmelidir. Bir sinyal numarasını belirtirken sembolik sinyal isimlerini kullanmanız gerekir (Standart Sinyaller). Doğrudan doğruya numarasını belirtmeyin, çünkü sinyallerin numaraları işletim sistemleri arasında değişiklik gösterebilir.
İkinci argüman olan eylem ise, sinyalnum sinyali için kullanılacak eylemi belirtmek için kullanılır. Bu şağıdakilerden biri olabilir:
SIG_DFL
SIG_DFL, belli bir sinyal için öntenımlı olan eylemi belirtir. Çeşitli sinyaller için öntanımlı olan eylemler Standart Sinyaller bölümünde bulunabilir.
SIG_IGN
SIG_IGN, sinyalin yoksayılacağını belirtmek için kullanılır.
Normalde yazılımınız birbiri ardınca gelen eylemlere ait sinyalleri ya da sonlandırma isteği olarak kullanılan sinyalleri yoksaymamalıdır. SIGKILL veya SIGSTOP sinyalini ne yaparsanız yapın yoksayamazsınız. SIGSEGV benzeri bir sinyali yoksayabilirsiniz, ama bir hatanın yoksayılması ve yazılımın çalışmasını sürdürmesi anlamlı olmaz. SIGINT, SIGQUIT ve SIGTSTP gibi kullanıcı isteğini belirten bir sinyali yoksaymak pek dostça sayılmaz.
Yazılımınızın belli bir bölümünde sinyallerin alınmasını istemiyorsanız onları yoksaymayın, onları engelleyebilirsiniz.
eylemci
Sinyal alındığında yapılacak eylemi gerçekleştirecek işlevin adresi belirtilir.
Sinyalle tetiklenen işlevler hakkında daha ayrıntılı bilgi edinmek için Sinyal Yakalayıcıların Tanımlanması bölümüne bakınız.
Bir sinyal için SIG_IGN veya SIG_DFL belirtirseniz ve öntanımlı eylem sinyalin yoksayılması ise, bekleyen sinyallerden bu türde olanları (engellenmeye çalışılsa bile) iptal edilir. Bekleyen bir sinyalin iptal edilmesi, hemen ardından başka bir eylem belirtilmedikçe ve bu tür sinyallerin engellenmemesi istenmedikçe, bunların asla alınmayacağı anlamına gelir.
signal işlevi, sinyalnum sinyali için evvelce belirtilmiş olan eylemle döner. Böylece, bu değeri saklayabilir ve daha sonra signal işlevini tekrar çağırarak bu eylemin tekrar etkin olmasını sağlayabilirsiniz.
Eğer signal işlevi kendinden isteneni yerine getiremezse SIG_ERR ile döner. Bu işlev için tanımlanmış errno değerleri:
EINVAL
Geçersiz bir sinyalnum belirttiniz; ya da SIGKILL veya SIGSTOP için sinyal yakalayıcı oluşturmaya ya da bunları yoksaymaya çalıştınız.
Uyumluluk Bilgisi
signal işlevi ile çalışırken saptanmış bir sorun, BSD ve SVID sistemlerdeki davranış farkıdır. SVID sistemlerde sinyal yakalayıcı sinyal alındıktan sonra kendiliğinden tekrar kurulur. BSD sistemlerde ise yakalayıcı tekrar kurulmak zorundadır. GNU C kütüphanesinde öntanımlı olarak BSD sürümünü kullanıyoruz. SVID sürümünü kullanmak isterseniz, aşağıda anlatılan sysv_signal işlevini ya da bir makro seçici olan _XOPEN_SOURCE'u kullanabilirsiniz (Özellik Sınama Makroları). Uyumluluk sorunlarından kaçınmak için normalde bu işlevler kullanılmamalıdır. Bunlar yerine uyumluluk açısından bir sorun çıkarmayan sigaction'ı kullanmak daha iyidir.
Aşağıda, bazı ölümcül sinyaller alındığında geçici dosyaları silen basit bir yakalayıcı örneği yeralmaktadır:
#include <signal.h>

void
termination_handler (int signum)
{
  struct temp_file *p;

  for (p = temp_file_list; p; p = p->next)
    unlink (p->name);
}

int
main (void)
{
  ...
  if (signal (SIGINT, termination_handler) == SIG_IGN)
    signal (SIGINT, SIG_IGN);
  if (signal (SIGHUP, termination_handler) == SIG_IGN)
    signal (SIGHUP, SIG_IGN);
  if (signal (SIGTERM, termination_handler) == SIG_IGN)
    signal (SIGTERM, SIG_IGN);
  ...
}
Eğer belirtilen bir sinyal evvelce yoksayılmaya ayarlanmışsa bu kodun bu ayarı değiştirmediğine dikkat edin. Bu, iş denetimi yapmayan kabukların alt süreçleri başlatırken bazı sinyalleri çoğunlukla yoksaymasından ve alt süreçler için buna riayet edilmesi önemli olduğundan dolayıdır.
Yazılım hata sinyallerini veya SIGQUIT sinyalini, hata ayıklamada bilgi sağlamak için (bellek dökümü almak için) tasarlandıklarından ve geçici dosyalar hata ayıklamak için faydalı bilgiler sağlayabileceğinden bu örnekte işleme sokmadık.
sighandler_t sysv_signal
(int          sinyalnum,
 sighandler_t eylem)
işlev
sysv_signal işlevi, SVID sistemlerindeki standart signal işlevinin davranışını gereçekleştirmek için tasarlanmıştır. Bunun BSD sistemlerinden farkı, bir sinyalin alınmasının ardından yakalayıcının kendiliğinden tekrar kurulmasıdır.
Uyumluluk Bilgisi
signal işlevi için yukarıda bahsedildiği gibi, bu işlevin kullanılmasından kaçınılmalı ve bunun yerine mümkünse sigaction tercih edilmelidir.
sighandler_t ssignal
(int          sinyalnum,
 sighandler_t eylem)
işlev
ssignal işlevi signal işlevinin yaptığını yapar; sadece SVID ile uyum için vardır.
sighandler_t SIG_ERR
makro
Bu makronun değeri, signal işlevinin dönen bir hata değeri olarak kullanılır.
Önceki Üst Ana Başlık Sonraki
Sinyal Eylemlerinin Belirtilmesi Başlangıç Gelişmiş Sinyal İşleme
Bir Linux Kitaplığı Sayfası