Gönderilen her sinyalin teslim edileceğine güvenemezsiniz. Örneğin, bir işlem, SIGCHLD'yi çıkmış bir alt işlemden alırken uzun zaman alıyorsa , linux çekirdeği SIGCHLD'yi "birleştirir" .
Sorunuzun başka bir bölümünü yanıtlamak için, bir dizi farklı sinyal aralığın çok kısa sürede geliyorsa sinyaller çekirdeğin içinde "kuyruğa alınır".
Sen kullanmalıdır sigaction()
ile sinyal işleyicisi kurmak sa_sigaction
üyesi siginfo_t
ayarlayarak, sa_mask
üyesi siginfo_t
dikkatlice argüman. Bunun en azından tüm "asinkch" sinyallerini maskelemek anlamına geldiğini düşünüyorum. Linux için man sayfasına göre sigaction()
, işlenen sinyali de maskeleyeceksiniz. sa_flags
Üyeyi SA_SIGINFO olarak ayarlamanız gerektiğini düşünüyorum , ama neden bu batıl inancım olduğunu hatırlayamıyorum. Bunun, işleminize hiçbir yarış koşulu olmadan ayarlanmış bir sinyal işleyici ve diğer çoğu sinyal tarafından kesintiye uğramayan bir sinyal işleyici alacağına inanıyorum.
Sinyal işleyici fonksiyonunuzu çok, çok dikkatli bir şekilde yazın. Temel olarak, bir sinyalin yakalandığını belirtmek için küresel bir değişken ayarlayın ve sürecin geri kalanı bu sinyal için istenen eylemle ilgilensin. Sinyaller bu şekilde en az bir süre maskelenecektir.
Ayrıca, sinyal işleme kodunuzu çok ayrıntılı bir şekilde test etmek isteyeceksiniz. Küçük bir test sürecine koyun ve 2 veya 3 özel amaçlı sinyal gönderme programından mümkün olduğunca çok sayıda SIGUSR1 ve SIGUSR2 sinyali gönderin. Kodunuzun SIGUSR1 ve SIGUSR2'yi hızlı ve doğru bir şekilde işleyebileceğinden emin olduktan sonra diğer bazı sinyalleri de karıştırın. Kendinizi zor hata ayıklamaya hazırlayın.
Eğer linux ve sadece linux kullanıyorsanız signalfd()
, select()
bu sinyalleri almak için yapabileceğiniz veya yoklayabileceğiniz bir dosya tanımlayıcı oluşturmak için kullanmayı düşünebilirsiniz . Kullanımı signalfd()
hata ayıklamayı kolaylaştırabilir.
signal(2)
bu karışıklığı önlediğinizi vurgulamaktadırsigaction(2)
.