signal

method

int sigaction(int sig, const struct sigaction *act, struct sigaction *oldact);

struct sigaction {
  /* sa_handler. sa_sigactionは片方のみ使う */
  void (*sa_handler)(int);
  void (*sa_sigaction)(int , siginfo_t*, void*);
  sigset_t sa_mask;
  int sa_flags;
};

point

ハンドラの再設定

sgiaction()は、OSにかかわらず シグナルハンドラの設定を保持し続けることが保証されています。

システムコールの再起動

sigaction()は、デフォルトではシステムコールを再起動しません。 sa_flagsメンバにSA_RESTARTを追加すると再起動する設定になります。 一般的には再起動される方が便利なので、SA_RESTARTは常に追加しておくのが無難です。

シグナルのブロック

struct sigactoinのメンバsa_maskで、ブロックするシグナルを指定できます。 さらに、シグナルハンドラの起動中は処理中のシグナルを自動的にブロックしてくれるので、 ほとんどの場合はsa_maskは空にしておけば十分です。 sa_maskを空にするには、sigemptyset()を使います。

例: example

signalで簡単にやる方法

任意のSGINALを任意のfuncでトラップする.

signal (SIGNAL, func)

シグナル

概要

SIGINT

キーボードからの割り込み Ctrl + C

SIGQUIT

キーボードに夜中止 Ctrl + または Ctrl + 4

SIGTSTP

端末(tty)から入力された一旦停止 Ctrl + Z

SIGTERM

終了 (コマンド)kill pid

SIGSTOP

一時停止 (コマンド) Kill -s SIGSTOP pid