C Programlama

C Programlama ile POSIX Sinyalleri

C Programlama ile POSIX Sinyalleri
Bir sinyali, belirli bir önemli durum için varış zamanı geldiğinde bir işlemi veya ipliği uyarmak için tetiklenen bir aktivite olarak tanımlayabiliriz. Bir prosedür veya iş parçacığı bir sinyali kabul ettiğinde, prosedür veya iş parçacığı her ne yapıyorsa onu durduracak ve hemen harekete geçecektir. Süreçler arası koordinasyonda, sinyal etkili olabilir. Bu kılavuzda, C dili aracılığıyla Linux'ta sinyal işleyicileri öğreneceksiniz.

Standart veya Normal Sinyaller:

Başlık dosyası 'sinyali.h', içinde makro sabiti olarak belirtilen sinyallere sahiptir. Sinyalin başlığı “SIG” ile başlar ve kısa bir sinyal genel bakışından önce gelir. Sonuç olarak, herhangi bir sinyalin ayrı bir sayısal değeri vardır. Program kodu, birkaç sinyali değil, sinyalin adını kullanmalıdır. Bunun nedeni, sisteme bağlı olarak sinyal sayısının değişebilmesi, ancak isimlerin yorumlanmasının standart olmasıdır. Aşağıda, işlevleri tanımlanmış bazı düzenli sinyaller verilmiştir.

SIGHUP:

Bu sinyal işlemi kapatacak. SIGHUP sinyali, muhtemelen bir uzak iletişimin kesilmesi veya kapanması nedeniyle, kullanıcı terminali bağlantısının koptuğunu belirtmek için yayınlanıyor.

İŞARET:

Süreci bozacak. Kullanıcı INTR tuşunu her girdiğinde SIGINT sinyali alınır (genellikle Ctrl + C).

SIGQUIT:

İşlemi durduracak veya çıkacak. SIGQUIT sinyali, kullanıcı QUIT tuşuna her girdiğinde alınır (genellikle Ctrl + \).

SİGİL:

Yasadışı bir komut yapıldığında çalışır. SIGILL sinyali, önemsiz veya ayrıcalıklı bir komut gerçekleştirmek için bir çaba gösterildiğinde oluşturulur. Yığın taşarsa ve makine bir sinyal denetleyicisini çalıştırırken sorun yaşarsa, SIGILL de oluşturulabilir.

SIGTRAP:

Bazı izleme tuzağı komutları yürütülürken çağrılır. SIGTRAP sinyali, bir kesme noktası komutu ve başka bir tuzak komutu tarafından oluşturulur. Hata ayıklayıcı böyle bir sinyal kullanır.

SİGABRT:

Durdurma sinyali denir. SIGABRT sinyali, abort() yöntemi çağrılarak oluşturulur. Böyle bir sinyal, yukarıda bahsedilen ve abort() yöntem çağrısı tarafından kaydedilen kod tarafından gözlemlenen yanlışlığı belirtmek için kullanılır.

SIGFPE:

Kayan noktalar için istisna; SIGFPE sinyali, feci bir matematiksel hata oluştuğunda üretilir.

SIGUSR1 ve SIGUSR2:

SIGUSR1 ve SIGUSR2 sinyalleri istediğiniz gibi kullanılabilir. Sinyali alan uygulamada bu tür sinyaller için bir sinyal işleyicisi oluşturmak, işlemler arası kolay etkileşim için faydalıdır.

Sinyallerin Varsayılan Davranışı:

Her sinyal için standart davranış veya eylem vardır ve işleyici işlevini kullanarak varsayılan davranışı ayarlamak mümkündür. Otomatik SIGKILL ve SIGABRT sinyal davranışı değiştirilemez veya ihmal edilemez.

terim: İşlemi sonlandıracak.

çekirdek: Bir çekirdek döküm belgesi oluşturulacak ve işlem sonlandırılacak.

Ateş: Süreç bir sinyali gözden kaçırır.

Dur: Operasyonu durduracak.

Devam: Operasyon durdurulmadan sürdürülecek.

Sinyal İşleme:

İşlem, onaylandığında bir sinyal için bir davranış tercihine sahiptir. İşlem aşağıdaki gibi davranabilir:

Tanımlanan sinyal davranışı göz ardı edildiğinde sinyal otomatik olarak reddedilir.

Sinyal veya imza gibi yöntemleri kullanarak kod, bir işleyici işlevi kaydedebilir. Bir işleyiciden bir sinyal yakalamak denir.

Bir sinyal tedavi edilmiyor veya ihmal edilmiyorsa, standart eylem gerçekleşebilir.

Sinyal İşleme işlevini şu şekilde tanımlayabilirsiniz:

$ Int sinyal () int signum, void (*funk)(int))

İşlem bir sinyal işareti aldığında, signal() yöntemi 'func' yöntemini çağırabilir. Signal(), başarılıysa veya errno'ya ve bunun yerine -1'e bir istisna döndürülürse, bir işaretçiyi 'func' yöntemine geri döndürür.

'Func' işaretçisi üç değer alabilir:

SIG_DFL: Bu, başlıkta tanımlanan standart SIG DFL() yöntemine yönelik bir işaretçidir.h sinyalinin standart davranışını almak için kullanılan belge.

SIG_IGN: Bu, başlıkta belirtilen SIG IGN() yoksayma yöntemine bir başvurudur.h belgesi.

Kullanıcı tanımlı işleyici yöntemi işaretçisi: Kullanıcı tanımlı işleyici yöntemi türü void(*)(int), dönüş kategorisinin geçersiz olduğunu ve tek bağımsız değişkenin int olduğunu belirtir.

Yeni bir dosya 'sinyali oluşturun.c' ve içine sinyal işleyici kodunun altına yazın.

sinyali bağla.gcc ile c dosyası.

sinyali çalıştırırken.c dosyasında, ana yöntemde yürütülen sonsuz bir döngümüz var. CTRL+C'ye basıldığında, işleyici yöntemini başlattı ve ana yöntem yürütmesi durdu. İşleyici yönteminin tamamlanmasından sonra ana yöntem işleme devam etti. Ctrl+\'ya basıldığında işlem sonlandırılır.

Sinyali Yoksay:

Sinyali gözden kaçırmak için bir 'signal' dosyası oluşturun.c' ve altına kodu yazın.

Yok saymayı bağla.gcc ile c dosyası.

sinyali çalıştır.c dosyası. CTRL+C'ye dokunun, SIGNIT sinyali oluşturulur; yine de, işleyici yöntemi SIG_IGN() yöntemine numaralandırıldığından davranış fark edilmez.

Sinyal İşleyiciyi Yeniden Kaydet:

Sinyal işleyiciyi yeniden kaydetmek için yeni bir dosya oluşturun 'rereg.c' ve içine aşağıdaki kodu yazın:

rereg'i ilişkilendirin.gcc ile c dosyası.

rereg'i çalıştırın.c dosyası. CTRL+C'ye ilk kez basıldığında işleyici yöntemi yükseltildi ve sinyal işleyici SIG_DFL'ye yeniden kaydedildi. CTRL+C'ye tekrar basıldığında yürütme sonlandırıldı.

Raise() Kullanarak Sinyal Gönderin:

Bir dosya oluştur 'gönder.c' ve aşağıdaki kodu ekleyin. Çağıran yönteme sinyal göndermek için yükseltme() yöntemi kullanılır.

Gönderiyi ilişkilendir.gcc ile c dosyası.

İşlem, SIGUSR1 sinyalini kendi başına iletmek için yükseltme() yöntemini kullanır.

Kill() Kullanarak Sinyal Gönderin:

Aşağıdaki kodu 'yükselt' içine ekleyin.c'. İşlem grubuna sinyal göndermek için kill yöntemini() kullanın.

Yükseltmeyi bağla.gcc ile c dosyası.

kill() yöntemini kullanarak, işlem SIGUSR1 sinyalini yukarıda belirtilenlere yönlendirir.

Ebeveyn-Çocuk Etkileşimi:

Ebeveyn-çocuk etkileşimini izlemek için aşağıdaki kodu bir dosyaya yazın.

İletişimi bağla.gcc ile c dosyası.

Fork()/ yöntemi çocuk üretir, alt sürece sıfırı döndürür ve ebeveyn kimliğine çocuk kimliği verir.

Sonuç:

Bu kılavuzda, Linux'ta süreçler arası etkileşim için sinyali oluşturmayı, işlemeyi, göndermeyi, yok saymayı, yeniden kaydetmeyi ve kullanmayı gördük.

How to Change Mouse and Touchpad Settings Using Xinput in Linux
Most Linux distributions ship with “libinput” library by default to handle input events on a system. It can process input events on both Wayland and X...
Remap your mouse buttons differently for different software with X-Mouse Button Control
Maybe you need a tool that could make your mouse's control change with every application that you use. If this is the case, you can try out an applica...
Microsoft Sculpt Touch Wireless Mouse Review
I recently read about the Microsoft Sculpt Touch wireless mouse and decided to buy it. After using it for a while, I decided to share my experience wi...