2011-08-08 18 views
5

Sinyal işleyicisinin neden sonsuz döngüye gittiği hakkında bir fikriniz var mı?Sinyal işleyici neden sonsuz döngüye gider? - SIGSEGV

İşte kod. Lütfen bana yardım edin.

enter code here 
9 void SIGSEGV_handler(int signal) 
10 { 
11 printf("Segmentation fault caught....\n"); 
12 printf("Value of instance variable: i = %d\n\n", i); 
13 } 
16 
17 int main() 
18 { 
19 char *mallocPtr, *callocPtr, *reallocPtr, *memalignPtr, *vallocPtr; 
20 struct sigaction sa; 
21 
22 sa.sa_handler=SIGSEGV_handler; 
23 sigaction(SIGSEGV, &sa, NULL); 
24 
37 
38 printf("The segmentation fault handler will be entered for i = 3, 4, 5 and 6\n"); 
39 
40 
41 for(i=0; i<7; i++) 
42 { 
43 printf("i = %d\n",i); 
44 
45 mallocPtr=(char*)malloc(3); 
46 printf("Malloc address : %x\n",mallocPtr); 
47 strcpy(mallocPtr, "Hhvhgvghsvxhvshxv"); 
48 puts(mallocPtr); 
+0

Sadece ben miyim, yoksa tüm "for" döngüsünü göndermediniz mi? Belki de daha da ileriye doğru bir şey yapıyorsunuz ve ben de bunu küresel olarak ilan ettiğine ve tek başına – Djole

+0

yapmak için kötü bir şey olduğuna inanıyorsunuz. Bir sinyal işleyicide printf'i güvenilir bir şekilde çalamazsınız. SIGSEGV için bir işleyiciden güvenilir bir şekilde geri dönemezsiniz (bunun yerine çıkmalısınız). –

+0

Hayır, çıkamıyorum .. çünkü benim durumumda, işleyiciye gideceği aralıkları yakalamam gerekiyor (3 ila 6 saniye olabilir). – kingsmasher1

cevap

14

SIGSEGV için varsayılan eylem, işleminizi sonlandırmaktır. Ama bir işleyici yükleyin ve bu geçersiz:

/* Does nothing to "fix" what was wrong with the faulting 
* instruction. 
*/ 
void SIGSEGV_handler(int signal) 
{ 
    printf("Segmentation fault caught....\n"); 
    printf("Value of instance variable: i = %d\n\n", i); 
} 

Yani bir SIGSEGV tetikleyen her komut için, bu işleyici denir ve talimat yeniden başlatılır. Ama sizin işleyiciniz, ilk etapta yanlış yönlendirme talimatıyla yanlış olanı düzeltmek için hiçbir şey yapmadı.

Sonuç olarak, talimat yeniden başlatıldığında, tekrar hata verecektir. Ve tekrar, ve tekrar ... ... fikri anladın.

+0

Ama bekliyorum: Hata giderme talimatında, işleyici çağrılacak ve karşılığında bir sonraki kod satırına gitmeli, doğru mu? (sonraki satır, yani, hata giderme komutundan sonraki satır) – kingsmasher1

+0

@ kingsmasher1 Hayır. Bir sonraki satıra gitmiyor. Mevcut komutu tekrar çalıştırmayı dener. – cnicutar

+3

@ kingsmasher1: nesne kodunda, bir "sonraki satır" kavramı yok. Sadece işlemci talimatları. –

İlgili konular