私はLinuxシグナルの初心者です、助けてください。 次のコードは、Linux 2.6 gccで実行するとコアダンプを取得します。シグナルSIGFPE質問
は$ ./a.out
浮動小数点例外(コアダンプ)
質問:
1.プロセスシグナルマスクが設置されているので、すべきではないラインによって生成された "SIGFPGE" 40(z = x/y)はブロックされますか?
2.ブロックされていない場合、シグナルハンドラがインストールされているため、コアダンプではなくシグナルハンドラで "SIGFPE"をキャプチャしないでください。
3. 40行目をコメントアウトして(z = x/y)、代わりに42行目(raise(SIGFPE))を使用すると、すべてが期待どおりに機能します。 x/0とSIGFPEを上げるの違いは何ですか?
ここコードである:
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
void sig_handler(int signum)
{
printf("sig_handler() received signal %d\n", signum);
}
int main(int argc, char * argv[])
{
// setup signal mask, block all signals
sigset_t set;
sigfillset(&set);
if(sigprocmask(SIG_BLOCK, &set, NULL)<0)
{
perror("failed to set sigmask");
return -1;
}
// install signal handler for SIGFPE
struct sigaction act;
act.sa_handler = sig_handler;
act.sa_mask = set;
act.sa_flags = 0;
if(sigaction(SIGFPE, &act, NULL)<0)
{
perror("sigaction failed");
exit(-1);
}
volatile int x =1;
volatile int y =0;
volatile int z = x/y;
//raise(SIGFPE);
printf("point 1000\n");
return 0;
}
+1。最新の仕様は[Issue 7](http://pubs.opengroup.org/onlinepubs/9699919799/functions/sigprocmask.html)です。 :-) – Nemo
@ニモ:ありがとう。ルールはまだありますが、言葉遣いが少し変わったので、私は答えを更新しました。 –
答えをありがとう。私は "未定義"が嫌いです。 –