次のコードでは、SIGSEGVシグナルを処理し、バインドされた変数を最小化することによって エラー状態を修正しています。私は、シグナルハンドラが復帰するたびに、シグナルが発生している間、命令を再スタートすると思います。シグナルハンドラでは、私は、バインドされた変数を最小限に抑えるが、それでもSIGSEGVを取得し、私はそれはCとPOSIX標準あたり未定義の動作だ間違っエラー状態はまだC言語でSIGSEGVが返ってきている
#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()'は非同期シグナルセーフではなく、シグナルハンドラから安全に呼び出すことはできません。 **シグナルハンドラから** async-signal-safe関数のみを呼び出すことができます。 http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_04 –
シグナルハンドラから戻ったときに命令が再開されるという保証はありません。何かあれば、私はその反対を期待しています。しかし、実際にはどちらにも依存することはできません。 –
結論:このコードは動作しません。修正する方法はありません。セグメンテーション違反を取得することは、生の卵を壊すようなものです。後でピースを拾う方法はありません。 (唯一の解決策は、セグメンテーション違反を持たないこと/最初の場所で卵を壊すことです)。 –