2016-04-12 5 views
0

プロセスにSIGIOシグナルの束を送り、そのプロセスがSIGIOシグナルをブロックして何か他のことをしている場合。シグナルをブロック解除すると、SIGIOシグナルが1つだけ、または複数のSIGIOシグナルが順番に存在しますか?信号をブロックする動作は何ですか?

+0

を私はしばらくの間、これを研究して、というし、コメントとして、答えをこのままにしておきます。。私には分かりませんでした。私が理解したところでは、答えは「はい」です...それはあなたにいくつかの信号か単一の信号のどちらかを与えるでしょう、これはどちらも信号ですほとんどのシグナルはマージされますが(単一のシグナルが受信されます)、一部は持続することがあります(一部のIOシグナルはマージされるべきではないメタデータを持ちますが、これはOSに依存します)... 。**私はどの信号を指定することをお勧めします**。 – Myst

+2

1つまたは複数の配信があるかどうかに応じて、それは依存します。可能な複製:http://stackoverflow.com/questions/6343871/about-the-delivery-of-standard-signals – fluter

答えて

0

答えは...それは依存しています。

最初に送信される信号は、ハンドラメソッドによって「処理」されます。ハンドラには、上部と下部の2つの部分があります。トップはすばやく、信号を取得してフラグを設定して戻ってください。下の部分がその旗をチェックしてから反応します。現在、Linux/UNIXシステムの中には、シグナルが発生したときにハンドラをデフォルトにリセットするものがあります(ハンドラ内のシグナルのsigactionをリセットする必要があります)。

信号はキューに入れられますが、実装によってはわずかです。あなたが信号のアローを送信している場合は、キューがいっぱいになった後に発生するシグナルをすべて失う可能性があります。

マニュアルページのシグナルとsigactionを参照してください。

ここには、AIX/Linuxソリューションがあります。最初にハンドラを設定します。

sigset_t mask; 
sigemptyset(&mask); 

#ifdef AIX 
exitaction.sa_handler = C_signalExit; 
exitaction.sa_mask = mask; 
exitaction.sa_flags = SA_OLDSTYLE; 
#else // LINUX 
sigaddset(&mask, SIGHUP); 
sigaddset(&mask, SIGQUIT); 
sigaddset(&mask, SIGTERM); 
exitaction.sa_sigaction = C_signalActionExit; 
exitaction.sa_mask  = mask; 
exitaction.sa_flags  = SA_SIGINFO; 
#endif 

ハンドラのコード(上) - 私は、Linux上の信号を処理するために、「回避策を注入」(まだAIXとの互換性のあるコードを保つ) SystemOSしなければならなかった、ここで注意が信号や他を処理するクラスですOS関連の活動。

#ifdef AIX 
void C_signalExit(int signal) { sys->signalExit(signal,0,NULL); } 
void SystemOS::signalExit(int signal, int code, struct sigcontext *sigcon) 
#else // LINUX 
void C_signalActionExit(int signal, siginfo_t* siginfo, void *data) 
{ sys->actionExit(signal,siginfo,data); } 

void SystemOS::actionExit(int signal, siginfo_t* siginfo, void* data) 
#endif 
{ 
    switch(signal) 
    { 
    case SIGINT : // interrupt from keyboard (^C ??) 
    case SIGKILL : // can't be caught or ignored // 080209 can't be blocked with sigblock() fields set si_pid,si_uid - see sigqueue(3) 
    case SIGTSTP : // ^Z 
    case SIGTTIN : // background read 
    case SIGTTOU : // background rite 
#ifdef AIX 
    case SIGDANGER: // disk space 
    case SIGPRE : // program exception 
    case SIGSAK : // secure attention 
#endif 
    default : 
     exec.kill(signal,SIGNAL_ERROR); // exec is the 'main program' 
    } 
} 

exec.killが下半分になります。信号と値を受け取り、アプリケーションを終了します。あなたはそこにいくつかの他の機能を持っている(そのない標準的な方法だろう - しかし、自分のアプリケーションフレームワークの一部

を、私はこのことができます願ってい

+0

PS:将来の拡張のためにswitch文があります - 他の特定のアクションが必要な場合。この例では、すべての信号がデフォルトで処理されます(これは、最後のケースのすべての 'fall-into'ケースです(デフォルト:ケース)) – Thaddeus