2011-12-20 2 views
6
私はプログラムの中で、特定のブール変数を変更するために、2つのプロセスへの信号、 SIGUSR1SIGUSR2を送信する必要が

からSIGUSR2セットそれにSIGUSR1セット、それを) 。だから私はSIGUSR1またはSIGUSR2の振る舞いを制御するためにsignalHandler()関数を書きました。問題は:sigaction()この特定のタスクを処理する方法を設定するには?私はGoogleで多くの時間を費やしましたが、どこでもsignal()の代わりにsigaction()を使用する必要があります。私が考えた最初のフィールドに使用は

struct sigaction { 
     void  (*sa_handler)(int); 
     void  (*sa_sigaction)(int, siginfo_t *, void *); 
     sigset_t sa_mask; 
     int  sa_flags; 
     void  (*sa_restorer)(void); 
    }; 

:manページでは、私は、私は、sigaction構造体のパラメータを持って、私が処理したい信号の種類を配置する必要がシグナムでこの

int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact); 

を見つけました私は私のシグナルハンドラの名前を設定する必要がありますが、私は他のフィールドをどのように設定できるのか分かりません。

最後に、どのような使用ですか:struct sigaction *oldact

+0

'oldact'は、信号番号' signum'の以前のシグナルハンドリング状態を保存します。 – moshbear

+0

@moshbear私はそれを使用したくない場合はNULLに設定できますか? – Sicioldr

+0

__はい、できます。 (下線を赦してくださいが、コメントには15文字分の制限があります)。 – moshbear

答えて

7

マニュアルページsigaction(2)を参照してください。それはすべてそこに記載されています。

基本的には、余分な信号情報を必要とするかどうかによって、sa_handlerまたはsa_sigactionのいずれかを設定します。

後で設定する場合、フラグにSA_SIGINFOを追加する必要があります。それ以外の場合、フラグはおそらく0の場合があります。シグナルで中断されたときには、errno EINTRでシステムコールを失敗させる(デフォルト動作)ので、再起動する前に新しい変数の値を考慮することができますが、自動的に再起動したい場合はselectpoll再起動した場合)、SA_RESTARTフラグを設定できます。

sa_maskは、このシングルハンドラが実行されている間に考慮する必要がある信号のセットです。少なくとも2つの信号を設定する必要があります。したがって、信号がすぐに連続すると混乱することはありません。

最後に、sa_restorerは廃止され、とにかく未使用です。