のシグナルハンドラをインストールするプログラムがありますSIGSEGV
。シグナル ハンドラー (クラッシュをキャッチしようとする) で、アプリケーションを再起動します。
しかし、私のアプリケーションが復活すると、それはSIGSEGV
もう処理されません。
次に例を示します。
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
const char * app = 0;
void sig_handler(int signo)
{
puts("sig_handler");
const pid_t p = fork();
if (p == 0)
{
printf("Running app %s\n", app);
execl(app, 0);
}
exit(1);
}
int main(int argc, char** argv)
{
app = argv[0];
struct sigaction act;
sigemptyset(&act.sa_mask);
act.sa_handler = sig_handler;
act.sa_flags = 0;
const int status = sigaction(SIGSEGV, &act, 0) == 0;
printf("signaction = %d\n", status);
sleep(5);
int* a = 0;
int b = *a;
return 0;
}
出力で得られるものは次のとおりです。
./signals
signaction = 1
sig_handler
Running app ./signals
signaction = 1
したがって、sighandler が正しい方法で設定されていることがわかりますが、復活したアプリは静かにクラッシュしました。
私は何が欠けていますか?