почему этот обработчик сигнала называется бесконечно - PullRequest
0 голосов
/ 26 декабря 2010

Я использую Mac OS 10.6.5, g ++ 4.2.1.И столкнуться с проблемой с помощью следующего кода:

#include <iostream>
#include <sys/signal.h>
using namespace std;

void segfault_handler(int signum)
{
    cout << "segfault caught!!!\n";
}

int main()
{
    signal(SIGSEGV, segfault_handler);

    int* p = 0;
    *p = 100;

    return 1;
}

Кажется, что segfault_handler вызывается бесконечно и остается в печати:

segfault перехватил !!!
segfault перехватил !!!
Сегфоут пойман !!!
...

Я новичок в разработке для Mac, у вас есть идеи о том, что случилось?

Ответы [ 2 ]

1 голос
/ 26 декабря 2010

Это потому, что после выполнения вашего обработчика сигнала EIP возвращается к инструкции, которая вызывает SIGSEGV - поэтому он выполняется снова, и SIGSEGV снова вызывается.

Обычно игнорирование SIGSEGV, как вы делаете, в любом случае бессмысленно - предположим, что инструкция действительно читает какое-то значение из указателя на регистр, что бы вы сделали? У вас нет «правильного» значения для ввода в регистр, поэтому следующий код, скорее всего, снова будет SIGSEGV или, что еще хуже, вызовет некоторую логическую ошибку.

Вы должны либо выйти из процесса, когда происходит SIGSEGV, либо вернуться к известной безопасной точке - longjmp должен работать, , если , вы знаете, что это действительно безопасная точка (единственный возможный пример, который приходит на ум это интерпретаторы VM / JIT).

0 голосов
/ 26 декабря 2010

Вы пытались вернуть 0 вместо 1 в вашей программе?Традиционно значения, отличные от 0, указывают на ошибку.Кроме того, устраняет ли удаление двух строк, имеющих дело с * p?

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