Linux çekirdeğindeki sinyal mekanizması, çalışan uygulamaların yeni bir olay meydana geldiğinde sistemi eşzamansız olarak bilgilendirmesine izin verir. Bu sinyal mekanizması doğası gereği genellikle yazılım kesintileri olarak bilinir. Tıpkı donanım kesintileri gibi, sinyaller de bir uygulamanın normal akışını keser ve bir uygulamanın ne zaman bir sinyal alacağı tahmin edilemez.
Linux'taki sinyal mekanizmasının derinliklerine inelim ve perde arkasında neler olduğunu anlayalım.
Linux'ta Temel Sinyal Kavramları
Linux'ta süreçler üç temel durumda sinyal üretir:
- Donanım tarafında istisnai bir durum oluştuğunda. Örneğin, uygulamanın dış bir bölgeye erişmeye çalışması gibi olayları düşünebilirsiniz. izin verilen adres alanı (segmentasyon hatası) veya sıfıra bölme içeren makine kodu oluşturma operasyon.
- Gibi tuş kombinasyonlarının kullanılması gibi durumlar Ctrl + C veya Ctrl + Z konsolda kullanıcı tarafından konsol ekranını yeniden boyutlandırma veya bir öldürme sinyali gönderme.
- Uygulamada ayarlanan zamanlayıcının süresinin dolması, uygulamaya verilen CPU limitinin yüksek olması, verilerin açık bir dosya tanıtıcısına gelmesi vb.
Sinyal kavramı, Unix'in ilk sürümlerinden beri var. Önceden, Unix sürümleri arasında sinyal işlemeyle ilgili birkaç fark vardı. Daha sonra, POSIX standardizasyonu sinyal yönetimi için yapılmış, Linux ve diğer Unix türevleri bu standartları takip etmeye başladı. Bu nedenle bazı belgelerde karşılaşabileceğiniz Unix sinyalleri ve POSIX sinyalleri kavramları farklılıklara işaret etmektedir.
Sinyal Numaraları
Sinyaller, birden başlayarak çeşitli sayısal değerlere sahiptir. Örneğin, sinyal 1 bir HUP hemen hemen her sistemdeki sinyal veya sinyal 9, bir ÖLDÜRMEK sinyal.
Ancak, uygulamalarınızda sinyal kullandığınızda bu sayıların kullanılması kesinlikle önerilmez. POSIX sinyalleri için, sinyal.h dosyası uygulamada olmalı ve geliştirici, aşağıdaki gibi ilgili sayıların sabit tanımlarını kullanmalıdır. SIGHUP, SIGKILL, vb. yerine.
eğer incelerseniz /usr/include/signal.h Dosya sisteminizde, ek işlemleri ve içerdiği diğer dosyaları aşağıdaki gibi değerlerin tanımlarına bakarak görebilirsiniz. __USE_POSIX, __USE_XOPEN, __USE_POSIX199309, vb. dosyanın içinde. Linux sistemlerinde mevcut sinyal numaralarını şurada bulabilirsiniz: /usr/include/asm-generic/signal.h doğrudan uygulama kodunuza eklemeniz gerekmeyen dosya.
Sinyal Oluşturma ve Gönderme
Bir olay nedeniyle sinyal üretimi gerçekleşir. Ancak sinyalin ilgili uygulamaya gönderilmesi (teslim edilmesi) sinyalin üretilmesi ile aynı anda gerçekleşmez.
Uygulamaya gönderilecek sinyal için uygulamanın halihazırda çalışıyor olması ve CPU kaynaklarına sahip olması gerekir. Bu nedenle, belirli bir uygulamaya bir sinyalin gönderilmesi, bağlam geçişinden sonra ilgili uygulama tekrar çalışmaya başladığında gerçekleşir.
Bekleyen Sinyal Konsepti
Sinyalin üretilmesinden iletilmesine kadar geçen süre boyunca, sinyaller bekleme durumundadır. Bekleyen sinyal sayısına ve bir işlem için izin verilen bekleyen sinyal sayısına şuradan erişebilirsiniz. /proc/PID/status dosya.
# PID'li bir işlem için: 2299
cat /proc/2299/durum
# Çıktı
...
SigQ: 2/31630
...
Sinyal Maskeleri ve Engelleme
Sinyallerin tam olarak ne zaman geleceği uygulama tarafından genellikle tahmin edilemez. Bu nedenle herhangi bir işlem sırasında bazı kritik kesintiler meydana gelebilir. Bu, büyük ölçekli bir uygulama için büyük sorunlara neden olabilir.
Bunun gibi bazı istenmeyen durumları önlemek için sinyal maskelerinin kullanılması gerekmektedir. Böylece kritik bir işlemden önce bazı sinyalleri engellemek mümkündür. Bu aşamada kritik kısmı tamamlamak ve tanımlanan blokları kaldırmak önemlidir. Bu süreç, uygulama geliştiricisinin dikkat etmesi gereken bir şeydir.
Uygulama bir sinyali engellediğinde, üretilen aynı tipteki diğer sinyaller, bloke kaldırılana kadar bekleme durumunda olacaktır. Uygulamada, blok kaldırılır kaldırılmaz, bekleyen sinyallerin gönderilmesi de sağlanmaktadır.
Bu sayede blok anında beklemeye alınan aynı tip sinyaller, normal kullanımda blok kaldırıldıktan sonra uygulamaya sadece bir kez gönderilir. Gerçek zamanlı sinyaller için durum farklıdır.
Linux Sinyal Türleri
Varsayılan eylemler sinyal türlerine göre değişiklik gösterebilir. Karşılık gelen sinyali alan uygulamanın bir sinyal işleyici işlevi yoksa, varsayılan eylem gerçekleşir. Bazen bu, uygulamayı sonlandırmak ve bazen de sinyali yok saymak anlamına gelir.
Bazı sinyaller uygulama katmanında yakalanamaz, bu sinyaller her zaman varsayılan eylemi gerçekleştirir (KILL sinyali gibi).
Bir uygulamanın sonlandırılmasına neden olan bazı eylemlere ek olarak, bir çekirdek döküm dosyası da üretilir. İlgili işlemin sanal bellek tablosunun diske yazılmasıyla oluşturulan çekirdek döküm dosyaları, Kullanıcı, sonraki aşamalarda hata ayıklama araçları ile süreç bitmeden durum bilgilerini incelemelidir.
Aşağıdaki değerler bir örnek MIPS mimarisi:
sinyal | Sayı | Varsayılan aksiyon | Yakalanabilir mi? |
---|---|---|---|
SIGHUP | 1 | Uygulamayı sonlandır | Evet |
İŞARET | 2 | Uygulamayı sonlandır | Evet |
SIGQUIT | 3 | Uygulamayı sonlandır (çekirdek dökümü) | Evet |
SİGİL | 4 | Uygulamayı sonlandır (çekirdek dökümü) | Evet |
SIGTRAP | 5 | Uygulamayı sonlandır (çekirdek dökümü) | Evet |
SİGABRT | 6 | Uygulamayı sonlandır (çekirdek dökümü) | Evet |
SIGFPE | 8 | Uygulamayı sonlandır (çekirdek dökümü) | Evet |
SIGKILL | 9 | Uygulamayı sonlandır | Numara |
SIGBUS | 10 | Uygulamayı sonlandır (çekirdek dökümü) | Evet |
SIGSEGV | 11 | Uygulamayı sonlandır (çekirdek dökümü) | Evet |
SIGSYS | 12 | Uygulamayı sonlandır (çekirdek dökümü) | Evet |
SIGPIPE | 13 | Uygulamayı sonlandır | Evet |
SİGALRM | 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 | Aldırmamak | Evet |
SIGTSTP | 20 | Durmak | Evet |
SIGURG | 21 | Aldırmamak | Evet |
SİGPOLL | 22 | Uygulamayı sonlandır | Evet |
DURDUR | 23 | Durmak | Numara |
SIGCONT | 25 | Durmuşsa devam et | Evet |
SİGTTİN | 26 | Durmak | Evet |
SIGTTOU | 27 | Durmak | Evet |
SIGVTALRM | 28 | Uygulamayı sonlandır | Evet |
SIGPROF | 29 | Uygulamayı sonlandır | Evet |
SIGXCPU | 30 | Uygulamayı sonlandır (çekirdek dökümü) | Evet |
SIGXFSZ | 31 | Uygulamayı sonlandır (çekirdek dökümü) | Evet |
Linux'ta Sinyallerin Yaşam Döngüsü
Sinyaller üç aşamadan geçer. Temel olarak üretim aşamasında, çekirdek veya herhangi bir işlem tarafından üretilirler ve bir sayı ile temsil edilirler. Üzerlerinde ekstra yük olmadığı için hafif ve hızlı çalışırlar. Ancak POSIX tarafına bakarsanız, gerçek zamanlı sinyallerin ekstra veri iletebildiğini görürsünüz.
Sinyallerin teslim aşaması, üretim aşamasından sonra gelir. Normalde sinyaller uygulamaya mümkün olan en kısa sürede çekirdekten ulaşır. Ancak bazen uygulamalar kritik işlemleri yaparken sinyalleri engelleyebilir. Bu gibi durumlarda, işlem gerçekleşene kadar sinyal beklemede kalır.
Sinyaller gibi süreçler de Linux ekosisteminin ayrılmaz bir parçasıdır. Bir Linux sistem yöneticisi olmayı planlıyorsanız, süreçlerin ne olduğunu ve nasıl çalıştığını anlamak çok önemlidir.
Linux'ta Süreç Nedir?
Sonrakini Oku
İlgili konular
- Linux
- Linux çekirdeği
- Sistem Yönetimi
Yazar hakkında

Matematik ve teknolojinin hayranı olan bir mühendis ve yazılım geliştiricisi. Bilgisayarları, matematiği ve fiziği her zaman sevmiştir. Oyun motoru projelerinin yanı sıra makine öğrenimi, yapay sinir ağları ve lineer cebir kütüphaneleri geliştirmiştir. Ayrıca makine öğrenmesi ve lineer matrisler üzerinde çalışmalarını sürdürmektedir.
Haber bültenimize abone ol
Teknik ipuçları, incelemeler, ücretsiz e-kitaplar ve özel fırsatlar için bültenimize katılın!
Abone olmak için buraya tıklayın