Am einfachsten ist es, einen Signal-Handler einzurichten, der auf Zugriffe auf Speicherplätze prüft, die mmap
ed-Adressen entsprechen.
würden Sie die sigaction
Form von Signal-Handler verwenden, anstatt den einfacheren signal
Handler als sigaction
Handler Informationen im struct __siginfo *
Parameter entsprechend der Adresse des Empfangssignals. Dies kann überprüft werden, um festzustellen, ob es sich innerhalb des Adressbereichs der mmap
Ed-Datei befindet.
mmap
ist großartig, wenn Sie nicht mit den Komplikationen des Pufferlesens/Schreibens von Daten umgehen wollen, aber Sie bekommen nur eine Form von Fehler (ein Signal) wegen etwas schief geht. mit dem read
/write
Mechanismus, können Sie die errno
und ermitteln, was passiert ist. Es ist sehr viel eine Entwicklerwahl in diesem Fall.
zu einer Stelle zu springen, nachdem das Signal dann müssen Empfangen Sie Nutzung des setjmp
und longjmp
/siglongjmp
machen - sehen einige Verwendung dieser in this question
Ich denke nicht, dass das wegen möglicher Rennbedingungen sehr hilfreich ist. Würde es helfen, 'SIGBUS' um den Code herum zu erwarten, der auf die gemappte Region zugreift? Oder etwas ähnliches? –
Nein. 'SIGBUS' ist nicht unbedingt wiederherstellbar, obwohl einige Implementierungen den fehlerhaften Befehl nach der Rückkehr vom Handler erneut versuchen. –
@SimonRichter Sie müssen den fehlerhaften Befehl nicht erneut versuchen, Sie müssen lediglich feststellen, dass Sie nicht mit einem Lese-/Schreibvorgang fortfahren können. Danach beenden Sie die Versuche, auf den Bereich zuzugreifen und mit einer Fehleranzeige zum Aufrufer zurückzukehren. Vielleicht wäre 'setjmp()'/'longjmp()' in der Lage, die wiederholte Ausführung der fehlerhaften Anweisung zu vermeiden. –