-1
ここでは、この問題の簡単なレクリエーションだcatchedされています。何が起こるかは、端末からCTR + Cを一度しか読み取ることができないことです。 2番目のポイント以降は、単にコンソールに^ Cを書き込むだけです。私はハンドラを毎回リセットする必要がありますか?前もって感謝します。SIGINTの葛は一度だけ
ここでは、この問題の簡単なレクリエーションだcatchedされています。何が起こるかは、端末からCTR + Cを一度しか読み取ることができないことです。 2番目のポイント以降は、単にコンソールに^ Cを書き込むだけです。私はハンドラを毎回リセットする必要がありますか?前もって感謝します。SIGINTの葛は一度だけ
signal
は高度に定義されており、そのためにsigaction
を使用する必要があります。あなたが見ているのは、いわゆるsysvセマンティクスがsignal
です。シグナルはハンドラ内でSIG_DFL
にリセットされ、再実行がブロックされません。
は、おそらくのようなものとします。これは、信号をリセットしないであろうと、それはそれをブロックしません
#include <unistd.h>
#include <signal.h>
#include <stdio.h>
#define WRITE_LIT(fd, lit) write(fd, lit, sizeof lit - 1)
void handler(int sig){
if(sig == SIGINT){
WRITE_LIT(2, "Signal caught\n");
execl("./recreate","./recreate", (char*)NULL);
WRITE_LIT(2, "Couldn't run ./recreate\n");
_exit(127);
}
}
int main(){
printf("Main start\n");
sigaction(SIGINT, &(struct sigaction const){
.sa_handler = handler,
.sa_flags = SA_NODEFER /*don't block signals for the new process image*/
},
0);
while(1);
return 0;
}
をいずれか(デフォルトはハンドラの継続のためにそれをブロックすることがある)ので、新しいプロセス画像がブロックされたくない可能性があります。
'signal 'の動作は、あなたが持っているUnixの亜種によって異なります。一貫した動作を得るには、代わりに['sigaction'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/sigaction.html)を使用してください。 –
一般的なシグナルハンドリングのための優れたドキュメントと、特に 'man'コマンドを介してオンラインで利用できる' signal() '関数があります。 –
また、 'printf'はシグナルハンドラを呼び出すための安全な関数ではないと考えられます。 –