Atomik Veri Erişimi ve Sinyal İşleme
Önceki Sinyal Yakalayıcıların Tanımlanması Sonraki
Atomik Veri Erişimi ve Sinyal İşleme
Uygulama verinizin atomsal ya da sırt metin olup olmamasına bağlı olarak, atomik olmayan tek bir veriye erişirken dikkatli olmalısınız. Bir nesnenin okunması ya da yazılması tek bir makine kodu ile gerçekleşemeyebilir, böyle bir durumda bir sinyal yakalayıcı işlemin arasına girebilir ve işlem yarıda kalabilir.
Bu sorunla ilgili olarak uygulanabilecek üç yöntem vardır. Veri türlerine erişimi atomsal yapabilirsiniz; işlemi dikkatlice yapılandırabilir böylece erişimin kesilmesi sözkonusu ise böyle bir veri erişimini hiç yapmazsınız ya da veriye erişirken işlem sırasında sinyallerin tamamını engellersiniz.
Atomsal Olmayan Veriye Erişimle İlgili Sorunlar
Bu örnekte, bir değişkenin değerinin değiştirilmesi sırasında bir sinyal yakalama işlevinin araya girdiği durum gösterilmiştir. (Bir değişkenin okunması sırasında kesintiye uğratılması mantıksız sonuçlara sebep olabilir, ama burada sadece yazma olayı gösterilmiştir.)
#include <signal.h>
#include <stdio.h>

volatile struct two_words { int a, b; } memory;

void
handler(int signum)
{
    printf ("%d,%d\n", memory.a, memory.b);
    alarm (1);
}

int
main (void)
{
    static struct two_words zeros = { 0, 0 }, ones = { 1, 1 };
    signal (SIGALRM, handler);
    memory = zeros;
    alarm (1);
    while (1)
      {
        memory = zeros;
        memory = ones;
      }
}
Yazılım, memory değişkenini sırayla sıfırlarla ve birlerle doldurmaktadır. Bu sırada her saniyede bir, alarm sinyalinin yakalayıcısı o anki içeriği basmaktadır. (Eylemci içinde printf kullanımı, sinyal oluştuğu sırada printf eylemci dışında çağrılmadığından bu kod için sorun çıkarmaz.)
Başka bir deyişle yazılım sıfır ya da bir çiftlerinde birini basar. Ama bu iş tamamen bizim istediğimiz gibi olmaz! Çoğu makinede, memory değişkeninde yeni değerin saklanması bir makine komutundan fazlasına ihiyaç duyar. Bu komutların çağrılması sırasında bir sinyal alınırsa, eylemci memory.a için 0, memory.b için 1 ya da tersini basabilir (Normalde ikisi de aynı olmalıydı).
Bazı makineler, işlemi tek bir makine kodu ile yapabilir ve bu durumda eylemci daima sıfır ya da bir çiftleri basar.
Atomsal Türler
Bir değişkene erişimin ne olursa olsun kesintiye uğratılamamasını sağlam için erişimin daima atomsal olduğu veri türünü kullanabilirsiniz: sig_atomic_t. Bu veri türündeki bir değişkene yapılan bir okuma veya yazma işleminin tek bir makine kodu ile gerçekleştirilmesi garanti edilmiştir. Böylece bir sinyal yakalayıcının işlemin arasına girmesi engellenmiş olur.
sig_atomic_t türü daima bir tamsayı veri türüdür, ama hangisi olduğu yani kaç bit genişlikte olduğu makineden makineye değişebilir.
sig_atomic_t
veri türü
Bu bir tamsayı veri türüdür. Bu türdeki nesnelere erişim daima atomsaldır.
Uygulamada, int türünü atomsal olduğunu varsayabilirsiniz. Ayrıca çok elverişli olmasa da gösterici türlerininde atomsal olduğunu varsayabilirsiniz. GNU C kütüphanesini destekleyen makinelerde ve bilinen tüm POSIX sistemlerinde her iki kabulde geçerlidir.
Atomsal Kullanım Şekilleri
Bir erişimin kesmeye uğratılmasından kaçınılmasını sağlayan belli erişim şekikilleri vardır. Örneğin, sinyal yakalama işlevi tarafından bir seçenek etkinleştirilebilir ve ana yazılım tarafından bu değişken zaman zaman 1 ya da 0 yapılabilir. Böylece, bir veriye erişim için iki komut gerekiyorsa bu işlem güvenceye alınmış olur. Bunun böyle olduğunu göstermek için, veriye her erişimin kesmeye uğratılmaya çalışıldığını kabul edeceğiz, ancak kesmeye uğratılsa bile bunun bir sorun oluşturmadığını göstereceğiz.
Seçeneğin sınanması sırasında bir kesme sorun çıkarmayacaktır, çünkü ya değerin kesinliğinin önemi olmadığı duruma karşılık değer sıfırdan farklı olacak ya da bir sonraki sınama için sıfırdan farklı görünecektir.
Seçeneğin sıfırlanması sırasında da bir kesme sorun çıkarmayacaktır, çünkü seçenek sıfırlanmadan önce bir sinyal geldiğinde ne olacağına bağlı olarak ya değer sıfır olacak ya da sıfırdan farklı olacaktır.Kod her iki durumu da olması gerektiği gibi mümkün olduğunca iyi elde eder, ayrıca seçeneğin sıfırlanması sırasında bir sinyal yakalama işlemi de yapılabilir.
Kimi zaman, bir nesneye erişimin kesintiye uğratılmamasını, nesnenin başka bir nesne tarafından korunmasını sağlayarak sağlama alabilirsiniz, bu da atomsallığı garanti etmenin yollarından biridir. Örnek için Eylemci Çalışmadan İkinci Bir Sinyalin Alınması bölümüne bakınız.
Önceki Üst Ana Başlık Sonraki
Sinyal İşleme ve Evresel Olmayan İşlevler Başlangıç Sinyallerle Kesilen İlkeller
Bir Linux Kitaplığı Sayfası