Ich würde mal auf folgendes Problem Tippen:
Nach dem du deinen Signalhandler aufgerufen hast, kommst du wieder an die Stelle im Code, die das Aufrufen des Signalhandlers verursacht hat. Da du dann aber wieder eine Division durch 0 durchführst, springt dein Programm wieder in den Signalhander.
Eine einfache Lösung wäre im Signalhandler die Variablen so zu verändern, dass du nicht mehr durch 0 dividierst. In deinem Beispiel dann b>0.
Alternativ könnte man noch mit setjmp/longjmp (in setjmp.h) arbeiten, die Division aber zu "korriegieren" wäre die einfachere Möglichkeit.
Trotzdem mal den Code liefern