Почему обработчик сигнала идет в бесконечный цикл? - SIGSEGV - PullRequest
7 голосов
/ 08 августа 2011

Есть идеи, почему обработчик сигнала переходит в бесконечный цикл?

Вот код. Пожалуйста, помогите мне.

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);

Ответы [ 2 ]

16 голосов
/ 08 августа 2011

Действие по умолчанию для SIGSEGV - завершить ваш процесс.Но вы устанавливаете обработчик и переопределяете это:

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

Таким образом, для каждой инструкции, запускающей sigsegv, этот обработчик называется , а инструкция перезапускается .Но ваш обработчик не сделал ничего, чтобы исправить то, что было неправильно в первую очередь с ошибочной инструкцией.

В заключение, когда инструкция будет перезапущена, она снова выйдет из строя.И снова, и снова, и ... вы поняли.

7 голосов
/ 08 августа 2011

http://pubs.opengroup.org/onlinepubs/009604599/functions/xsh_chap02_04.html#tag_02_04

Поведение процесса не определено после того, как он нормально возвращается из функции перехвата сигнала для сигнала SIGBUS, SIGFPE, SIGILL или SIGSEGV, который не был сгенерирован kill (), sigqueue () или Повышать ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...