シグナル処理プログラムの記述方法(全体の流れ)
- 処理対象とするシグナル番号を選びます。
-
シグナル受信時の処理内容を、ユーザ定義関数として記述します。
- ユーザ定義関数内では、第1引数がシグナル番号となります。
- ユーザ定義関数内での、使用できる関数に制約はありません。
- 定義したユーザ関数をシグナルハンドラとして設定します。
シグナルモニタの例
受信したシグナル番号を表示する例です。このため、処理対象とするシグナル番号は、ユーザー側にてキャッチ可能な全てシグナル番号とします。なお、このプログラムは CTRL+C でも終了しなくなるため、CTRL+C 受信時には KILL -9 による終了方法を表示することとしました。
なお、ここではシグナル待ち受け時間中は pause() 関数で待つこととしましたが、他の処理を実行させていても問題はありません。
# シグナルハンドラとなるユーザ定義関数を2つ定義します。
# その1:CTRL+C 受信時のシグナルハンドラです。
def disp_signumber2(ival){
print("Signal Received!! [%d]\n",ival)
print("終了の仕方:当プロセス(%d)に、シグナル9番を送信して下さい。\n",PID);
print("( kill -9 %d )\n",PID);
}
# その2:他のシグナル受信時のシグナルハンドラです。
def disp_signumber (ival){
print("Signal Received!! [%d]\n",ival)
}
# シグナルハンドラを設定します。
for(i=1;i<NSIG;i++){ # i = シグナル番号です。(全てのシグナル番号を処理対象とします。)
if(i==2) # CTRL+C 受信時のシグナルハンドラを設定します。
rx_signal(i,&disp_signumber2())
else # 他のシグナル受信時のシグナルハンドラを設定します。
rx_signal(i,&disp_signumber ())
}
# シグナル待ち受けループに入ります。
while(TRUE){ # 繰り返しモニタ出来るように、無限ループとします。
pause() # シグナル待ち受け時はポーズで待ちます。
}