Linuxでsignal関数を用いてctrl+cなどの信号を処理する

1724 ワード

前言
linuxでは信号メカニズムによってプログラムのソフトブレークを実現することができ,非常に有用なプログラミング方法である.私たちは普段、プログラムが実行されている間にctrl-c、ctrl-z、killのプロセスを押すと、このプロセスに特定の信号を送信するのと同じです.プロセスが信号をキャプチャすると、プロセスは中断され、すぐに信号処理関数にジャンプします.デフォルトでは、ctrl-cに対するプログラムの信号(SIGINT)の処理はプロセスを終了するので、ctrl-cを押すとプロセスの実行を終了することができます.
Signal関数
しかし、私たちのプログラムが信号によって終了する前にいくつかの特定のエンドフローを実行することを望んでいる場合があります.あるいは、私たちのプログラムが特定の信号を受信した後に自分で定義した割り込み操作を実行することを望んでいます.linuxの下でsignal関数を通じて上記の機能を実装することができます.
例えば、Linuxの下にプログラムを書きます.もしプログラムにデッドサイクルが現れたら、キーボードでCtrl+Cを押してプログラムを終了しなければなりません.それでは、この信号をキャプチャして、自分の信号処理プログラムを実行して、デバッグを助けるために役立つ情報を出力することもできます.これもテクニックでしょう.もし私たちがこの信号をキャプチャしなければ、信号が発生した後にOSの信号処理プログラムを実行します.信号は割り込みと似ており,OSの割り込み処理プログラムを用いてもよいし,割り込みをキャプチャして独自の割り込み処理プログラムを実行してもよい.マルチスレッドの例を次に示します.
#include 
#include 
#include 
#include 
#include 

#define true 1

void * One(void * no) 
{
    while (true)
    {
    printf("NUAACS1
"); sleep(1); } } void * Two(void * no) { while (true) { printf("NUAACS2
"); sleep(1); } } void Stop(int signo) { printf("oops! stop!!!
"); _exit(0); } int main() { int res; pthread_t A, B; signal(SIGINT, Stop); res = pthread_create(&A, NULL, One, NULL); res = pthread_create(&B, NULL, Two, NULL); res = pthread_join(A, NULL); res = pthread_join(B, NULL); return 0; }

以上はネット上の資料ですが、もう一つ注意したいのは、プログラムが中断され、中断関数が実行された後、つまり中断関数で返されると、プログラムは中断前の位置に戻って実行を続ける前のプログラムに戻ります.信号処理関数はvoidのみを返し、指定したパラメータを返すことはできません.
また、一部の関数では、プログラムの割り込みがこれらの関数の正常な実行を中断する可能性があります.例えば、sleep関数では、プログラムがsleepの途中で中断されると、プログラムはすぐにsleepを終了します.