Temel Kavramlar
Sinyal Numaraları
Sinyaller sistemde 1'den başlamak suretiyle nümerik değerlerle gösterilirler.
Örnek olarak 1 nolu sinyal, hemen her sistemde HUP sinyali olarak değerlendirilirken 9 nolu sinyal de KILL sinyali olarak bilinir.
Bununla birlikte uygulamalarımızda sinyal kullandığımızda bu rakamların kullanılması kesinlikle önerilmez. POSIX sinyalleri için uygulama içerisinde <signal.h>
dosyası include edilmeli ve SIGHUP
, SIGKILL
gibi ilgili numaralara ait sabit tanımları kullanılmalıdır.
Sisteminizdeki /usr/include/signal.h
dosyasını inceleyecek olursanız, dosya içerisinde __USE_POSIX
, __USE_XOPEN
, __USE_POSIX199309
gibi değerlerin tanımlarına bakılarak yapılan ek işlemleri ve include edilen diğer dosyaları görebilirsiniz. Linux sistemlerdeki sinyal numaralarını uygulama kodunuzda doğrudan include etmeniz gerekmeyen /usr/include/asm-generic/signal.h
dosyasında bulabilirsiniz.
Sinyal Üretimi ve Gönderimi
Sinyal üretimi, bir olay nedeniyle gerçekleşir. Ancak sinyalin ilgili uygulamaya gönderilmesi (deliver) işlemi, sinyalin üretimi ile aynı anda olmaz.
Sinyalin uygulamaya gönderilebilmesi için uygulamanın o an CPU kaynağına sahip ve Running durumda çalışıyor olması gereklidir. Dolayısıyla belirli bir uygulamaya gönderilmek üzere üretilen bir sinyalin gönderimi, ilgili uygulamanın context-switch sonrası tekrar çalışmaya başlamasıyla birlikte gerçekleşir.
Bekleyen (Pending) Sinyal Kavramı
Sinyalin üretim anından gönderilme işlemi gerçekleşene kadarki süre zarfında, sinyaller pending olarak işaretlenir ve beklemede tutulur.
Bir process için bekleme durumundaki sinyal sayısı ve izin verilen pending sinyal sayısına, proc dosya sisteminden ilgili process id (PID) dizini altındaki /proc/PID/status
dosyasında SigQ: 2/15235 örneğindeki gibi erişilebilir.
Sinyal Maskeleri ve Bloklama
Sinyallerin asenkron doğası nedeniyle uygulama tarafından ne zaman geleceğinin öngörülemez olması, uygulamada kritik bir işlem yapılıyorken kesintiye uğrama riskini de beraberinde getirir.
Bu şekildeki istenmeyen durumların önüne geçebilmek için sinyal maskeleri kullanarak kritik bir işlem öncesi bazı sinyalleri bloklama, kritik olan kısım tamamlandıktan sonra da tanımlanmış blokları kaldırma imkanı sağlanmıştır. Bu işlem uygulama geliştiricinin sorumluluğundadır.
Uygulama tarafından bir sinyal bloklandığında, blok kaldırılana kadar üretilen aynı tipteki diğer sinyaller bekleme (pending) durumunu korur. Uygulamada blok kaldırıldığın anda bekleyen sinyallerin gönderimi de sağlanır.
Bu şekilde blok anında beklemeye geçen sinyallerden aynı tipte olanlar, normal kullanımda blok kaldırıldıktan sonra uygulamaya sadece 1 defa gönderilir. Realtime sinyallerde ise durum farklıdır.
Sinyal Türleri
Sinyal türlerine göre öntanımlı eylemler değişkenlik gösterebilmektedir. Eğer uygulama içerisinde ilgili sinyali karşılayan bir signal handler fonksiyonu tanımlanmamış ise, öntanımlı eylem gerçekleşecektir. Bu bazen uygulamanın sonlandırılması bazen de sinyalin gözardı edilmesi anlamına gelir.
Bazı sinyallerin ise uygulama katmanında yakalanması mümkün değildir, bu tarz sinyaller her zaman öntanımlı eylemi gerçekleştirirler (KILL sinyali gibi).
Uygulamanın sonlanmasına yol açan bazı eylemlerde ek olarak core dump dosyası da üretilir. Core dump dosyaları, ilgili process'in sanal bellek tablosunun diske yazılması suretiyle, sonraki aşamalarda debug araçları ile process'in sonlanmadan önceki durum bilgisinin incelenebilmesi amacıyla oluşturulur.
Sinyal | No | Öntanımlı Eylem | Yakalanabilir mi? |
---|---|---|---|
SIGHUP | 1 | Uygulamayı sonlandır | Evet |
SIGINT | 2 | Uygulamayı sonlandır | Evet |
SIGQUIT | 3 | Uygulamayı sonlandır (core dump) | Evet |
SIGILL | 4 | Uygulamayı sonlandır (core dump) | Evet |
SIGTRAP | 5 | Uygulamayı sonlandır (core dump) | Evet |
SIGABRT | 6 | Uygulamayı sonlandır (core dump) | Evet |
SIGFPE | 8 | Uygulamayı sonlandır (core dump) | Evet |
SIGKILL | 9 | Uygulamayı sonlandır | Hayır |
SIGBUS | 10 | Uygulamayı sonlandır (core dump) | Evet |
SIGSEGV | 11 | Uygulamayı sonlandır (core dump) | Evet |
SIGSYS | 12 | Uygulamayı sonlandır (core dump) | Evet |
SIGPIPE | 13 | Uygulamayı sonlandır | Evet |
SIGALRM | 14 | Uygulamayı sonlandır | Evet |
SIGTERM | 15 | Uygulamayı sonlandır | Evet |
SIGUSR1 | 16 | Uygulamayı sonlandır | Evet |
SIGUSR2 | 17 | Uygulamayı sonlandır | Evet |
SIGCHLD | 18 | Yoksay | Evet |
SIGTSTP | 20 | Durdur | Evet |
SIGURG | 21 | Yoksay | Evet |
SIGPOLL | 22 | Uygulamayı sonlandır | Evet |
SIGSTOP | 23 | Durdur | Hayır |
SIGCONT | 25 | Durdurulmuşsa sürdür | Evet |
SIGTTIN | 26 | Durdur | Evet |
SIGTTOU | 27 | Durdur | Evet |
SIGVTALRM | 28 | Uygulamayı sonlandır | Evet |
SIGPROF | 29 | Uygulamayı sonlandır | Evet |
SIGXCPU | 30 | Uygulamayı sonlandır (core dump) | Evet |
SIGXFSZ | 31 | Uygulamayı sonlandır (core dump) | Evet |