Linux/UNIXシステムプログラミングマニュアル-信号

2899 ワード

Linux/UNIXシステムプログラミングマニュアル
[ドイツ]Michael Kerrisk
第20章信号:基本概念第21章信号:信号プロセッサ関数(未記録)第22章信号:高度特性(未記録)

シグナル:基本コンセプト


信号は時間発生時のプロセスに対する通知メカニズムであり、ソフトウェア割り込みとも呼ばれる.プロセスに送信される多くの信号は、通常、カーネルに由来し、カーネルがプロセスに信号を生成するイベントを以下のように引き起こします.
  • ハードウェア異常
  • ユーザは、信号を生成することができる端末文字を入力する.ctrl-c、ctrl-z
  • ソフトウェアイベントが発生しました.たとえば、ファイル記述子の出力が有効になり、ターミナルウィンドウのサイズが調整され、タイマが期限切れになり、プロセスが実行するCPU時間が超過したり、そのプロセスのサブプロセスが終了したりします.

  • 各信号に対して、SIGxxx形式のシンボル敏感にこれらの整数を定義する唯一の小さな整数が定義される.Linuxの標準信号に対する番号は1~31である.
    man page of signal

    信号をキャプチャして処理する:signal(),sigaction()


    signal()
    #include 
    void ( *signal(int sig, void (*handler)(int)) ) (int);
        Returns previous signal disposition on success, or SIG_ERR on error
    

    sig:信号の番号handler:信号到着時に呼び出される処理関数のアドレス
    sigaction()
    #include 
    int sigaction(int sig, const struct sigaction *act, struct sigaction *oldact);
        Returns 0 on success, or –1 on error
    

    actは、信号の新しい処理を記述するデータ構造を指す.Sigaction()は、信号処理を取得しながら変更する必要がなく、信号プロセッサプログラムを呼び出す際の動作をより正確に制御するために、様々な属性を設定することもできる.

    送信信号:kill(),raise()およびkillpg()


    1つのプロセスはkill()システム呼び出しを使用して別のプロセスにコマンドを送信することができる.
    #include 
    int kill(pid_t pid, int sig);
        Returns 0 on success, or –1 on error
    

    pid:1つ以上のターゲットプロセスsigを識別する:送信する信号を指定する
    kill()を使用して、空の信号を渡してプロセスが存在するかどうかを検出できます.
    ゾンビプロセス:プロセスは死んでいますが、親プロセスはwait()を実行して終了ステータスを取得していません.
    プロセスはraise()を使用して自身に信号を送信できます.
    #include 
    int raise(int sig);
        Returns 0 on success, or nonzero on error
    

    単一スレッドプログラムでは、raise()の呼び出しはkill()の次の呼び出しに相当します.
    kill(getpid(), sig)
    スレッドをサポートするシステムはraise(sig)を次のように実現します.
    pthread_kill(pthread_self(), sig)
    killpg()は、あるプロセスグループのすべてのメンバーに信号を送信する
    #include 
    int killpg(pid_t pgrp, int sig);
        Returns 0 on success, or –1 on error
    

    killgp()呼び出しはkill()に対する次の呼び出しに相当する.
    kill(-pgrp, sig)

    信号の説明を表示


    各信号には、配列sys_に位置する印刷可能な説明の列があります.siglistで.strsignal()、psignnal()関数を使用してsys_を表示できます.Siglistでの信号の説明.

    シグナルセット


    複数の信号は、システムデータ型がsigset_である信号セットと呼ばれるデータ構造を用いて表すことができるt.関連する関数は次のとおりです.
  • sigemptyset()、sigfillset()、初期化信号セット
  • sigaddset()sigdelset()は、信号集中で信号
  • を削除する.

    信号マスク(ブロック信号伝達)The Signal Mask


    カーネルは、プロセスごとに信号マスク、すなわち信号のセットを維持し、プロセスに対する伝達をブロックします.ブロックされた信号がプロセスに送信されると、その信号の伝達は、プロセス信号マスクから信号が除去され、ブロックが解除されるまで遅延する.
    sigprocmask()システム呼び出しを使用して、信号マスクに信号をいつでも明示的に追加または除去することができる.
    受信された信号が現在ブロックされている場合、信号は接触してブロックされるまで待機状態を維持する.システムは標準信号に対してキュー処理を行わず、信号が待機状態(および後続の伝達)とマークされるのは一度だけ発生する.プロセスはsigpending()システム呼び出しを使用して待機信号セットを取得することができる.
    呼び出しpause()は、信号プロセッサ関数が呼び出し位置(または未処理信号がプロセスを終了するまで)を終了するまで、プロセスの実行を一時停止する.
    テキストリンクhttps://sun2y.me