2017-10-25 1 views
1
#include <stdlib.h> 
#include <stdio.h> 
#include <signal.h> 

int current = 0; 

void sigint_handle(int sig) { 
    printf("sigint: %d\n", current); 
} 

int main() 
{ 
    sigset(SIGINT, sigint_handle); 

    while (1) { 
     current++; 
     // if (current % 1000000 == 0) printf("hey\n"); 
    } 

    return 0; 
} 

GCC 7.2.0を使用して最適化レベル-O0でコンパイルした場合、このコードは期待どおりに動作します。しかし、他の最適化レベルでは、送信sigintは毎回sigint: 0を出力します。また、出力ラインのコメントが外されたときに、最適化に関係なく正しく動作します。GCC - POSIXシグナルを使用するときの最適化の無効化

シグナルに関して何か不足していますか、これはgccのバグですか、これは意図した動作ですか(もしそうなら、なぜですか?)?

+0

宣言' current':私はこのトピックに関するオースティングループの課題追跡の未解決の問題があります。 –

+1

他に何が欠けていますか?シグナルハンドラで 'printf()'を呼び出すことは、未定義の動作です。非同期シグナルセーフな関数だけが、シグナルハンドラから安全に呼び出すことができます。 –

答えて

5

シグナルハンドラからの静的記憶期間とタイプがvolatile sig_atomic_t以外のオブジェクトにアクセスすると、定義されていない動作が発生します。このソースは(C11の場合)である。

7.14.1.1信号関数

[...]

5信号は、アボートを呼び出すかの結果として以外に発生した場合raise関数では、信号ハンドラが、volatileまたはsig_atomic_tとして宣言されたオブジェクトに値を代入する以外のロックフリーのアトミックオブジェクトではない静的またはスレッド記憶期間を持つオブジェクトを参照する場合、その動作は未定義です。

POSIX可能性が高い(将来の可能性のある方向性、まだ決定されていない)少し穏やかな条件で行動を定義する。ある意味では、それは間違いなく既にASセーフ機能を使って抜け穴を介して行われています。タイプ `揮発性sigatomic_t`として

http://austingroupbugs.net/view.php?id=728

関連する問題