Взгляните на эту программу Unix C:
#include <stdio.h>
#include <signal.h>
void handler(int signum)
{
printf("Handler signum=%d\n",signum);
}
int main(int argc, char *argv)
{
printf("Start\n");
signal(SIGFPE, handler);
int i=10/0;
printf("Next\n");
return 0;
}
Как видите, я подключаю SIGFPE к обработчику. Затем я делаю ошибку DIV0. Хэндлер уволен, и это здорово. Но этот обработчик вызывается в цикле! Почему ?
Спасибо
Вы также должны освежиться о том, что вы можете безопасно делать в функции обработчика сигналов.
Под зацикливанием я подразумеваю, что вижу много "handler signum = xxx" в моей консоли.
ты прочитал эту ссылку?
Извините, но я не понимаю. В конце есть пример, который я сделал ...





Если вы просто вернетесь из своего обработчика, выполнение возобновится в точке, где был выдан сигнал, что приведет к другой ошибке деления на ноль, что приведет к повторному вызову обработчика и т. д. Вам нужно организовать продолжение выполнения в какой-то другой момент кода. Традиционный подход - использовать setjmp / longjmp, что-то вроде этого
#include <stdio.h>
#include <signal.h>
#include <setjmp.h>
jmp_buf buf;
void handler(int signum)
{
longjmp(buf, signum);
}
int main(int argc, char *argv)
{
int rc = setjmp(buf);
if (rc == 0) {
printf("Start\n");
signal(SIGFPE, handler);
int i=10/0;
}
printf("Handler signum=%d\n", rc);
printf("Next\n");
return 0;
}
Примечание: это очень старый подход, и, вероятно, кто-то может предложить лучший способ справиться с ним. Кроме того, вам, вероятно, лучше вызвать sigaction, чем signal, поскольку семантика signal не согласована в разных версиях Unix.
В вашем коде нет циклов. Приведите лучший пример или объясните подробнее, какие результаты вы получаете и чего ожидаете.