2011-12-29 30 views
1

私が扱っているコードには、適切に処理するためにシグナル番号を切り替える共有シグナルハンドラがあります。シグナルハンドラでSIGRTMINとSIGRTMAXを安全に使用できますか?

カスタム信号を追加しています。この

static void signal_handler (int s) 
{ 
    if (s == SIGTERM) clean_up() ; 

    else if (s == SIGRTMIN+1) ; // do nothing 
} 

SIGRTMINSIGRTMAXようなものが

シグナル・ハンドラは、非リエントラントことになっている(私はGoogleのコード検索で見てきた実装で)静的データを初期化する関数呼び出しのの#defineです。アクセサの静的データをSIGRTMINSIGRTMAXに使用すると、これらのマクロはシグナルハンドラで使用するのが安全ではありませんか?

+1

あなたは、おそらくより良い、 'SIGTERM'および他のあなたのための' SIGRT * ' –

+0

@Basileのための1つを*異なる*シグナルハンドラ・ルーチンを持っている必要がありそうそれが一番簡単な方法、おかげだと思います。 SIGRTMIN/MAXがシグナルハンドラで使用するのが安全か安全でないかを知りたい場合は – wreckgar23

答えて

4

私はあなたが喫煙している実装を知りませんが、libcではこれらの関数はほとんどの場合一定の静的変数を返すようです。

init()の2回の呼び出しの間に競合が起こる可能性がありますが、単純に静的intを同じ定数に2回初期化するだけではほとんど心配はありません。

静的変数はそれほど一定ではありませんが、プログラムの開始時に変数を変更するように指示します(そして、pthreadだけがそれを実際に変更すると思います)。

これらの機能を気にする必要はありません(allocrtsig.c glibc 2.14から)。

本当に心配している場合は、シグナルハンドラをバインドする前にSIGRTMINを一度呼び出してください。 init()関数は途中で終了します。

/* Return number of available real-time signal with highest priority. */ 
int __libc_current_sigrtmin (void) 
{ 
#ifdef __SIGRTMIN 
    if (!initialized) 
    init(); 
#endif 
    return current_rtmin; 
} 
libc_hidden_def (__libc_current_sigrtmin) 

/* Return number of available real-time signal with lowest priority. */ 
int __libc_current_sigrtmax (void) 
{ 
#ifdef __SIGRTMIN 
    if (!initialized) 
    init(); 
#endif 
    return current_rtmax; 
} 
libc_hidden_def (__libc_current_sigrtmax) 
+0

ありがとうございます。実装は次のとおりですhttp://tinyurl.com/ccrrfm5このリンクは、アクセサではなく最初に呼び出されたときに初期化される '本当に定数'の属性を示しています。最初の呼び出しは、シグナルハンドラが追加されたときで、シグナルハンドラ内のそれ以降のアクセスは、それらの値を初期化するのではなく読み込みのみになります。 – wreckgar23

関連する問題