Linuxの信号

11857 ワード

Linuxの信号

  • 1.信号紹介
  • 2.信号の生成及び処理
  • 2.1信号の生成
  • 2.2信号の処理
  • 3.一般的な信号タイプおよび動作
  • 4.信号処理システム呼び出し
  • 4.1 signal()関数
  • 4.2 signal()関数
  • 1.信号紹介

  • 信号は、コンテンツが制限された非同期通信メカニズムであり、イベント発生時にプロセスに対する通信メカニズムであり、プロセスに非同期イベントが発生したことを通知するために使用される.
  • 信号は、ソフトウェア階層における割り込みメカニズムのシミュレーションであり、プログラムが実行する通常のプロセスを中断することができるソフトウェア割り込みとも呼ばれることがある.信号はプロセスにとって予測不可能な非同期イベントである.信号は本質的に予め定義されたint型数字番号(1から順に展開)である.

  • 2.信号の発生と処理


    2.1信号の発生

  • 1.ハードウェア異常、ハードウェアがエラーを検出してカーネルに通知し、カーネルは関連プロセスに対応する信号を送信します.
  • 2.ユーザは、端末で信号を生成できる割り込み特殊文字(割り込み文字:ctl+c、一時停止文字:ctl+z)を押下する.
  • 3.あるソフトウェア条件が満たされた後、ソフトウェア信号が生成される.

  • 2.2信号の処理

  • 信号は無視されます.カーネルは信号を破棄し、信号はプロセスに何の影響もありません.
  • プロセスの終了:システムに異常が発生した場合、カーネルはプロセスを終了します.
  • 信号をキャプチャする:信号は関数をバインドし、信号処理プログラム(伝達された信号に応答して適切なタスクを実行するための)を実行する.
  • デフォルト処理:現在のプロセスには明らかな管理信号がなく、デフォルト:プロセスを無視または終了します.

  • 3.一般的な信号タイプと動作


    完全な信号タイプは/usr/include/x 86_64-linux-gnu/bitsディレクトリのsignum.hファイルで表示します.
    /* Signals.  */
    #define SIGHUP      1   /* Hangup (POSIX).  */
    #define SIGINT      2   /* Interrupt (ANSI).  */
    #define SIGQUIT     3   /* Quit (POSIX).  */
    #define SIGILL      4   /* Illegal instruction (ANSI).  */
    #define SIGTRAP     5   /* Trace trap (POSIX).  */
    #define SIGABRT     6   /* Abort (ANSI).  */
    #define SIGIOT      6   /* IOT trap (4.2 BSD).  */
    #define SIGBUS      7   /* BUS error (4.2 BSD).  */
    #define SIGFPE      8   /* Floating-point exception (ANSI).  */
    #define SIGKILL     9   /* Kill, unblockable (POSIX).  */
    #define SIGUSR1     10  /* User-defined signal 1 (POSIX).  */
    #define SIGSEGV     11  /* Segmentation violation (ANSI).  */
    #define SIGUSR2     12  /* User-defined signal 2 (POSIX).  */
    #define SIGPIPE     13  /* Broken pipe (POSIX).  */
    #define SIGALRM     14  /* Alarm clock (POSIX).  */
    #define SIGTERM     15  /* Termination (ANSI).  */
    #define SIGSTKFLT   16  /* Stack fault.  */
    #define SIGCLD      SIGCHLD /* Same as SIGCHLD (System V).  */
    #define SIGCHLD     17  /* Child status has changed (POSIX).  */
    #define SIGCONT     18  /* Continue (POSIX).  */
    #define SIGSTOP     19  /* Stop, unblockable (POSIX).  */
    #define SIGTSTP     20  /* Keyboard stop (POSIX).  */
    #define SIGTTIN     21  /* Background read from tty (POSIX).  */
    #define SIGTTOU     22  /* Background write to tty (POSIX).  */
    #define SIGURG      23  /* Urgent condition on socket (4.2 BSD).  */
    #define SIGXCPU     24  /* CPU limit exceeded (4.2 BSD).  */
    #define SIGXFSZ     25  /* File size limit exceeded (4.2 BSD).  */
    #define SIGVTALRM   26  /* Virtual alarm clock (4.2 BSD).  */
    #define SIGPROF     27  /* Profiling alarm clock (4.2 BSD).  */
    #define SIGWINCH    28  /* Window size change (4.3 BSD, Sun).  */
    #define SIGPOLL     SIGIO   /* Pollable event occurred (System V).  */
    #define SIGIO       29  /* I/O now possible (4.2 BSD).  */
    #define SIGPWR      30  /* Power failure restart (System V).  */
    #define SIGSYS      31  /* Bad system call.  */
    #define SIGUNUSED   31
    
    #define _NSIG       65  /* Biggest signal number + 1
                       (including real-time signals).  */
    

    一般的な信号をいくつかまとめます.
    シグナルタイプ
    しんごうち
    しんごうきょどう
    SIGINT
    2
    Ctrl+Cの場合、OSはフロントプロセスグループの各プロセスに送信されます.
    SIGABRT
    6
    abort関数を呼び出し、プロセスが異常に終了します.
    SIGIO/SIGPOLL
    8
    SIGIOは非同期IOイベントを示し、SIGPLOOはsystemvから派生し、SIGIOと同義である.
    SKILL
    9
    プロセスを殺す究極の方法
    SIGSEGV
    11
    メモリリファレンスが無効な場合はOSから送信されます
    SIGPIPE
    13
    パイプとソケットに関する
    SIGALARM
    14
    alarm関数の実装に関する
    SIGTERM
    15
    killコマンドが送信するOSデフォルト終了信号
    SIGCHLD
    17
    サブプロセスが終了すると、OSは親プロセスにこの信号を送信します.
    SIGUSR1
    10
    ユーザカスタム信号
    SIGUSR2
    12
    ユーザカスタム信号

    4.信号処理システム呼び出し


    4.1 signal()関数

    #include 
    typedef void (*sighandler_t)(int);
    sighandler_t signal(int signum, sighandler_t handler);
    

    signal()関数は、現在のプロセスのある信号に対する処理方法を登録し、パラメータsignumは受信された信号タイプであり、パラメータhandlerは関数ポインタであり、信号処理方法関数である.Signalの戻り値はエラー時にSIG_ERR,バインド成功時に古いキャプチャ関数を返す.singnal()はunixとlinuxの異なるバージョンでは表現挙動が異なる可能性があるので、この関数を避けてsigaction()で代用することができます.Sigaction()はsignal()よりも移植性がある.

    4.2 signal()関数

    #include 
    int sigaction(int signum,
    			  const struct sigaction *act,
                  struct sigaction *oldact);
    
    struct sigaction {
    	void	(*sa_handler)(int);
    	void	(*sa_sigaction)(int, siginfo_t *, void *);
    	sigset_t	sa_mask;
    	int	sa_flags;
    	void	(*sa_restorer)(void);
    };
    

    Sigactionは、新しいキャプチャ関数の設定と古いキャプチャ関数の取得を一度に行うことができます(実際には、新しいキャプチャを個別に設定したり、古いキャプチャ関数のみを個別に取得したりすることもできます).signal関数は、古いキャプチャ関数を個別に取得するのではなく、新しいキャプチャ関数を設定したときに古いキャプチャ関数を取得する必要があります.