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
Last updated
Was this helpful?