"APUE":信号処理

  
 

プログラムの説明:Unix環境では、我々はプログラムは、いくつかのシグナル(SIGKILLシグナルとSIGSTOPを除く)マスクさせることができ、この例では、この点で機能を発揮します。

//"APUE" プログラム10-11:信号処理の例とは、sigprocmaskの#include< unistd.h>の#include< stdio.hの>の#include< STDLIB.H>の#include<信号.H> //エラーメッセージを出力し、ボイドerror_quit(CONSTするchar * STR)終了{関数fprintf(stderrに、"を;%S \\ N"、STR);出口(1);} //ハンドラボイドsig_quitのSIGQUIT信号( INTのSIGNO){のprintf(" SIGQUIT \\ N"をキャッチ;); IF(SIG_ERR ==信号(SIGQUIT、SIG_DFL))error_quit(" SIGQUIT"をリセットすることができない;);} int型メイン(ボイド){sigset_t newmask、oldmask 、pendmask; SIGQUIT信号(SIG_ERR ==シグナル(SIGQUIT、sig_quit))error_quitに//設定ハンドラであれば(" SIGQUIT"をキャッチすることはできません。); //newmask信号セットが空のsigemptyset(&#038に初期化されます。newmask ); //濃度信号newmaskのSIGQUIT信号sigaddsetの増加(&#038; newmask、SIGQUIT)int型温度; //oldmask現在のセットに設定されたマスク信号は、(将来の回復を容易にするために)//newmaskマスク信号電流信号増加を追加します設定温度=は、sigprocmask(SIG_BLOCK、&#038; newmask、&#038; oldmask); IF(温度< 0)error_quit(" SIG_BLOCKエラー");睡眠(5); //現在のマスク信号セットTEMP = sigpending(&#038を返す。pendmask);(温度<場合; 0)error_quit("エラー"をsigpending;); //SIGQUIT信号をチェックpendmaskに信号集中された場合(sigismember(アンプ&; pendmask、SIGQUIT))のprintf(" \\ nSIGQUITペンディング\\ N"); //マスク信号セットTEMP =は、sigprocmask(SIG_SETMASK、&#038を復元する。oldmask、

WWW:NULL); IF(温度< 0)error_quit(" SIG_SETMASKエラー");のprintf(" SIGQUITブロックされていない\\ n"は;);睡眠(5);}この例を実行し、0を返します。 linuxidc.com @ubuntu:〜/コード$のgcc -o temp.c一時www.linuxidc.com @ubuntu:〜/コード$ ./temp SIGQUIT SIGQUIT保留中の#は、スリープからのSIGQUITの#リターンを捕まえたら^ \\#信号が生成されますシグナルハンドラSIGQUITがブロックされていない#が出口信号が生成される^ \\#sigpromaskから返さwww.linuxidc.com @ubuntu再び:〜/コードの$ ./temp#は、プログラムを実行し、再び^ \\ ^ \\ ^ \\ ^ \\ ^ \\ ^ \\ ^ \\ ^ \\ ^ \\ ^ \\ ^ \\ ^ \\#SIGQUITキャッチSIGQUIT#は^ブロック解除唯一の信号SIGQUITを受ける保留中の複数の信号SIGQUITを生成します\\

結論
終了:

1:信号がもはや遮断されるまで、SIGQUIT信号を生成その間信号を遮断するSIGQUITプロセスは、ブロックされません。

2:信号が生成される場合、睡眠中に、次に信号は、この時点で保留中であるが、もはや遮断(SO終了する前に、sig_quit関数が呼び出されることができる)

3:信号を待ち行列システムの信号中にブロックされていません。

注釈(インターネット抜粋からこの通路):

信号'ペンディング'状態は、処理される信号に前方から生成された信号を指しますこの期間、信号'ブロッキング&'は、処理が、生成された信号を停止していないブロッキング信号を参照して、スイッチング動作です。

は、sigprocmaskと出口信号前閉塞性睡眠時にAPUE例えば、その後眠り、そして次に睡眠中出口信号を生成するが、終了信号を介して、この時間は、(中国語&'を遮断され、ブロッキング'でここで簡単にその&'ように、実際には、アクションは、同様の切り替え状態として誤って解釈され、スルー遮断'はなく、'&'をブロック;)は&'であるペンディング'状態、閉塞性睡眠時には、スイッチをオフにしてから撤退&'すぐに、スイッチを遮断する際の出口信号は、前の保留状態で生成されているためのsigprocmaskシグナルで終了し、保留中の'状態は、処理され、これはリターンのsigprocmaskで起こります前に。

Copyright © Windowsの知識 All Rights Reserved