2011-08-08 17 views
5

¿Alguna idea de por qué el manejador de señales va al bucle infinito?¿Por qué manejador de señal va al bucle infinito? - SIGSEGV

Aquí está el código. Por favor, ayúdenme.

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

¿Soy yo o no has publicado todo el ciclo 'for'? Tal vez más adelante esté haciendo algo para 'i' y creo que lo declaró globalmente y que solo es malo hacerlo – Djole

+0

No puede invocar de manera confiable printf en un manejador de señal. No puede regresar confiablemente desde un controlador para SIGSEGV (debe salir en su lugar). –

+0

No, no puedo salir ... porque en mi caso necesito detectar los intervalos que va a manejar (puede ser de 3 a 6 segundos). – kingsmasher1

Respuesta

14

La acción predeterminada para SIGSEGV es finalizar su proceso. Pero instalar un controlador y anular este:

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

Así, por cada instrucción que provoca una violación de segmento, este controlador se llama y la instrucción se reinicia. Pero su manejador no hizo nada para reparar lo que estaba mal en primer lugar con la instrucción de fallar.

En conclusión, cuando se reinicie la instrucción, volverá a fallar. Y de nuevo, y de nuevo y ... entiendes la idea.

+0

Pero espero: en las instrucciones de fallas, se llamará al controlador, y a su regreso debería ir a la siguiente línea de código, ¿verdad? (línea siguiente, es decir, la línea después de la instrucción de fallas) – kingsmasher1

+0

@ kingsmasher1 No. No pasa a la siguiente línea. Intenta ejecutar la instrucción actual nuevamente. – cnicutar

+3

@ kingsmasher1: en el código de objeto, no hay ninguna noción de una "línea siguiente". Solo son instrucciones del procesador. –