erhalten Im folgenden Code handle ich SIGSEGV-Signal und behebe die Fehlerbedingung durch Minimierung der gebundenen Variable. Ich denke, wann immer der Signal-Handler zurückkehrt, startet er den Befehl neu, während dem das Signal aufgetreten ist. Es ist undefiniertes Verhalten pro C und POSIX-Standards in Signal-Handler minimierte ich die gebundene Variable, aber immer noch SIGSEGV bekommen und in EndlosschleifeFehlerzustand ist weiterhin behoben, SIGSEGV wird in C
Nicht sicher zu gehen, wo ich falsch
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
void SIG_segfault_handler(int);
static int bound = 5800000;
int main(int argc,char *argv[])
{
signal(SIGSEGV,SIG_segfault_handler);
puts("This is the driver code for experimenting with signal");
int *array = malloc(50);
*(array+ 23) = 78;
puts("-------------------------------------------------------------------------------------");
*(array + bound) = 100;
printf("Data: %d , %d \n",*(array + 23),*(array + bound));
puts("Initialiazed array with 50 bytes.. \n End of driver code. ");
//free(array);
return 0;
}
void SIG_segfault_handler(int signum)
{
puts("This is segmentation fault.. cannot continue with the memory operation.. aborting");
puts("Signal SIGSEGV is handled by the program");
puts("Fixing the error conditions..");
bound = 2;
}
'puts()' ist nicht async-signalsicher und kann nicht sicher von einem Signalhandler aufgerufen werden. ** Nur ** async-signal-sichere Funktionen können von einem Signal-Handler aufgerufen werden. Siehe http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_04 –
Es gibt keine Garantie, dass der Befehl neu gestartet wird, wenn Sie von einem Signalhandler zurückkehren. Wenn überhaupt, würde ich das Gegenteil erwarten. Aber wirklich, Sie können sich nicht darauf verlassen. –
Fazit: Dieser Code wird nie funktionieren, es gibt keine Möglichkeit, es zu beheben. Eine Segmentierungsverletzung zu bekommen ist wie ein rohes Ei zu zerbrechen: Es gibt keine Möglichkeit, die Teile danach abzuholen. (Die einzige Lösung ist, die Segmentierungsverletzung nicht zu haben/das Ei überhaupt zu brechen.) –