2015-09-17 15 views
7

Ctrl + C'ye bastığımızda, bir SIGINT sinyalinin yükseltileceğini ve işlemin sonlandırılması için varsayılan eylemin çekirdek tarafından gerçekleştirileceğini biliyorum. Fakat bu sonlandırma için kod nereden geliyor? ELF binary'sinde mi, yoksa çekirdek bizim için mi? Ben çekirdekte olduğunu varsayalım ve bu nedenle, kaynak davranışımızda sinyal davranışını geçersiz kılmak için özel işleyicilere ihtiyacımız var.ELF ikili sisteminde varsayılan sinyal işleyici kodu nerede?

Herhangi bir işaretçi çok takdir edilecektir.

cevap

5

Çekirdeğin bizim için yaptığı bir şeydir. Tüm bilgileri, çekirdek kaynaklarda signal.c dosyasını okuyarak bulabilirsiniz. Çünkü eğer bir sinyal işleyici varsa, Yani http://lxr.free-electrons.com/source/kernel/signal.c#L2257

2257     ka = &sighand->action[signr-1]; 
2258 
2259     /* Trace actually delivered signals. */ 
2260     trace_signal_deliver(signr, &ksig->info, ka); 
2261 
2262     if (ka->sa.sa_handler == SIG_IGN) /* Do nothing. */ 
2263       continue; 
2264     if (ka->sa.sa_handler != SIG_DFL) { 
2265       /* Run the handler. */ 
2266       ksig->ka = *ka; 
2267 
2268       if (ka->sa.sa_flags & SA_ONESHOT) 
2269         ka->sa.sa_handler = SIG_DFL; 
2270 
2271       break; /* will return non-zero "signr" value */ 
2272     } 

ve eğer değilse "sinyali görmezden" (SIG_IGN) ve:

çekirdek tescilli sinyal işleyici bulmaya çalışıyor nokta burada başlıyor "varsayılan" işleyici (SIG_DEF) değil, çekirdek sadece çalıştırılmak üzere işaretleyecektir (ve tek çekime bağlı olarak işleyiciyi varsayılan işleyiciye tekrar taşıyacaktır).

Ancak belki de süreci duraklatmak ve son olarak aşağıdaki devletlere çekirdek gerekiyorsa SIG_DEF, çekirdek olup olmadığını kontrol eder sinyal işleyici kayıtlı veya varsa:

2330     /* 
2331     * Anything else is fatal, maybe with a core dump. 
2332     */ 

http://lxr.free-electrons.com/source/kernel/signal.c#L2330

+0

Daha fazla soru - 'IF' Kendi özel işleyicimi sağlıyor muyum? Özel işleyicide kodu kim yürütecek? Mantık OS 0'da veya halka 3'te işlem tarafından OS tarafından yürütülecek mi? – bawejakunal

+1

@bawejakunal: Halka 3'te yürütülür. Aksi takdirde tam bir güvenlik tehlikesi olur. – 3442

2

Let en kill(theShell, SIGINT) deyin. Ne olur bir şey gibi ... C çalışma zamanı kitaplığı sistem çağrısı sys_kill() tüm argümanları almak ve bir gerçekleştirir montaj kod yürütmesine devam edecek

  1. (aslında alakalı değil çünkü çekirdek kodlarını gösterilmiyor) ham sistem çağrısı.
  2. çekirdek argüman alıp, izinler çekleri, süreç SIG_DEF ayarlı karşılık gelen sinyal işleyici varsa vs, vs ...
  3. , çekirdek doğrudan ve döner gelen varsayılan eylemi gerçekleştirir gerçekleştirir. İşlem ilgili sinyal işleyicisine SIG_IGN olarak ayarlanmışsa, sinyal dikkate alınmaz ve sistem çağrısı geri döner. Aksi halde devam edin.
  4. Sinyal, gönderen gibi bazı bilgilerle birlikte hedef işlem için sinyal sırasına konur.
  5. Hedef işlemdeki bir iplik, sinyali almak için seçildiğinde ve maskelenmemesi durumunda, iş parçacığının içeriği (CPU yazmacılar, yığın işaretleyici, vb.) Kaydedilir ve sinyal işleyici çağrılır. İş parçacığı, sinyalin geldiği anda sistem çağrısındaysa, sistem çağrısı -EINTR (basitlik amacıyla) değerini döndürür ve işleyici çağrılır. İşleyici döndükten sonra, sistem çağrısı sys_sigreturn otomatik olarak çağrılır ve iş parçacığının sinyalden önceki durumu geri yüklenir.
  6. Bu sırada 5 adımı gerçekleşir, kill() ing işleminin sistem çağrısı geri döner.
İlgili konular