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