0

UNIX の高度なプログラミング ドキュメントによると、SIGFPE シグナルはプログラムを終了し、コア ファイルを生成します。

これが私のプログラムです

#include <unistd.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>

static void sig_fpe(int signo);

int
main()
{
        int pid;

        if(signal(SIGFPE, sig_fpe) == SIG_ERR)
                printf("Signal error\n");

        pid = 10;
        pid = pid / 0;

        exit(0);
}

static void
sig_fpe(int signo)
{
        if(signo == SIGFPE){

                printf("SIGFPE signal catch\n");
        }
}

このプログラムを Linux マシンで実行すると、「SIGFPE signal catch」が繰り返し出力され、終了しません。サンプル出力は

SIGFPE signal catch
SIGFPE signal catch
SIGFPE signal catch
SIGFPE signal catch
SIGFPE signal catch
SIGFPE signal catch
SIGFPE signal catch
SIGFPE signal catch
SIGFPE signal catch
SIGFPE signal catch
SIGFPE signal catch
SIGFPE signal catch
SIGFPE signal catch
SIGFPE signal catch
SIGFPE signal catch
SIGFPE signal catch
SIGFPE signal catch
.
.
.
.

何が問題ですか?

4

1 に答える 1

3

とは少しトリッキーSIGFPEです。SIGFPEがキャッチされると、単にハンドラーから戻ると、命令が再実行されます。これはプラットフォームに大きく依存しますが、シグナルのマニュアルページには未定義の動作が記載されています。

ここを参照してください: Unix シグナルの疑い - 以下のプログラムの実行について

コア ファイルも必要な場合は、デフォルトのシグナル ハンドラーを再インストールする必要があります。「Linux: セグメント化違反の処理とコア ダンプの取得」を参照し、コア ファイルを有効にします (Unix では で完了しますulimit -c ...) 。

于 2014-05-15T05:28:11.127 に答える