Linux信号(二)——signal関数

3190 ワード

フロイド氏は、これらの悩みを解決するには、当事者は自分の初期の子供の頃の経験を思い出し、理解することで、潜在意識の衝突に対する悟りを得る必要があると考えている.フロイドの治療法は「精神分析」(psychoanalysis)と呼ばれ、20世紀の長い間心理衛生従事者に広く採用された.《Change Your Thinking》
ilocker:Androidセキュリティ(新規参入、0ベース)に注目QQ:2597294287
1 #include <signal.h>
2 void (*signal(int signo, void (*func)(int)))(int);

signoで指定した信号に信号処理プログラムを設定します.成功すると前の信号処理プログラムへの関数ポインタが返され、エラーが発生するとSIG_が返されるERR.
signalの関数宣言が読めない場合は、c/c++の基礎(関数ポインタ)をよく復習しましょう.
signal関数の宣言を簡略化します.
1 typedef void SigFunc(int); // 
2 Sigfunc * signal(int signo, SigFunc * func);

簡単な例:
 1 void sig_handler(int signo) {
 2   if (SIGUSR1 == signo)
 3     printf(“received SIGUSR1.”);
 4   else
 5     printf(“received signal %d.”, signo);
 6 }
 7 
 8 int main() {
 9   if (SIG_ERR == signal(SIGUSR1, sig_handler))
10     printf(“can’t catch SIGUSR1”);
11 
12   for ( ; ; )
13     pause();
14 }

信号処理関数をSIG_に設定することもできますIGN(この信号を無視することを示す)またはSIG_DFL(システムのデフォルトの信号処理プログラムを使用することを示す).
信号SIGSTOP、SIGKILLはキャプチャまたは無視できません.
次の2点を記録しますが、検証されていません.正しく記述されているかどうかは不明です.
  • は、信号Aの処理プログラムが実行されていると仮定し、このとき別の信号Bが来た場合、Bの信号処理プログラムが実行され、処理が完了した後、Aの信号処理プログラムが実行される.
  • プロセスには、各ビットが1つの信号に対応し、ある信号を受信すると、対応するビットがセットされるソフトブレーク信号ドメインがある.したがって、同じ信号に対して、プロセスは、処理前にどれだけ受信されたか分からない.

  • signalのほかに、sigaction関数は信号処理関数を設定することができ、signalよりも複雑で、後でメモを書きます.
    学習資料:『unix環境高度プログラミング』