2011-08-08 12 views
5

Dowolny pomysł, dlaczego program obsługi sygnału przechodzi do nieskończonej pętli?Dlaczego obsługa sygnału idzie do nieskończonej pętli? - SIGSEGV

Oto kod. Proszę, pomóż mi.

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

Czy to tylko ja, czy nie opublikowałeś całej pętli 'for'? Być może w dalszej części robisz coś dla 'i' i wierzę, że zadeklarowałeś to globalnie i to samo jest złe. – Djole

+0

Nie możesz niezawodnie wywołać printf w procedurze obsługi sygnału. Nie można wiarygodnie powrócić z programu obsługi dla SIGSEGV (należy zamiast tego wyjść). –

+0

Nie, nie mogę wyjść .. ponieważ w moim przypadku potrzebuję przechwycić interwały, które będzie obsługiwał (może wynosić od 3 do 6 sekund). – kingsmasher1

Odpowiedz

14

Domyślnym działaniem dla SIGSEGV jest zakończenie procesu. Ale zainstalowaniu obsługi i zastąpić to:

/* 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); 
} 

Więc dla każdej instrukcji, która wyzwala SIGSEGV, uchwyt ten nazywany jest i dyspozycja zostanie wznowiona. Ale twój przewodnik nie zrobił nic, aby naprawić to, co było nie tak, po pierwsze za pomocą błędnej instrukcji.

Podsumowując, po ponownym uruchomieniu instrukcji nastąpi błąd. I znowu, i znowu, i ... masz pomysł.

+0

Ale oczekuję: przy błędnej instrukcji, program obsługi zostanie wywołany, a po powrocie powinien przejść do następnego wiersza kodu, prawda? (następna linia mam na myśli, linia po błędnej instrukcji) – kingsmasher1

+0

@ kingsmasher1 Nie. Nie przechodzi do następnej linii. Próbuje ponownie wykonać bieżącą instrukcję. – cnicutar

+3

@ Kingsmasher1: w kodzie obiektowym nie ma pojęcia "następnego wiersza". To tylko instrukcje procesora. –

Powiązane problemy