オペレーティングシステムしんごう


1)信号とは?


信号は、その名の通り、いかなる事件が発生しても伝送される「信号」である.信号は、同じように任意の信号を送信することを意味します.
たとえば、処理中に「Ctrl+c」をクリックしたことがあります.このとき、プロセスは信号を受信し、プロセスを終了する.プロセスにkillコマンドを発行するのもそうです.したがって、信号はソフトウェア中断の役割を果たし、プロセスに何が起こったか(イベント)を通知するメッセージを送信する.
受信信号のプロセスは、信号によって指定されたデフォルト動作(default action:killing terminal)を実行してもよいし、ユーザによって予め定義された関数(Signal handler)を実行してもよい.

2)サポートされる信号タイプ


サポートされる信号タイプは、「kill-l」コマンドで決定できます.以下の図2は、各機能について簡単に説明する.

図1)サポートされる信号タイプ

図2)信号説明

3)信号生成用ヘッダファイル


Linux環境で信号を使用してプロセス間通信を行うヘッダファイルがあります.信号は<信号です.h>という名前のヘッダファイルで定義します.このヘッダファイルをロードすると、Linux環境で信号伝達が実現されます.

4)署名例ソースコード


次のコードは、「キーボードスワップ」信号を受信したときに実行中のプロセスを強制的に終了する信号伝達を実現します.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> // for Linux Compiling (GCC)
#include <signal.h> // for Signals

void handlerFunction(int sig) { // Handler Function
  printf("\n>>> Received Keyboard Interupt(Ctrl+c) Signal!\n");
  printf(">>> Program will be terminated, if one more Keyboard Interupt Signal!!!\n");

  // SIGINT: Signal Terminal Interupt
  // SIG_DFL: Default Action for Signal (kill terminal if received SIGINT again)
  signal(SIGINT, SIG_DFL);
}

int main() {
    // Execute 'handlerFunction()' if received SIGINT(Keyboard Interupt: 'Ctrl + c')
    signal(SIGINT, handlerFunction);

    int cnt = 0;
    while(1) {
        printf("Time: %d(sec)\n", cnt++);
        sleep(1);
    }

    printf("Program Terminating...\n");

    exit(0);
}

5)署名サンプルコード実行結果


上記のソースコードをgccにコンパイルして実行した後、時間を測定し、キーボード割り込み(Ctrl+c)が発生したときに通知します.その後、キーボードの割り込み信号が再び表示されると、すぐに閉じます.

図3運転信号例コード画面

参考資料

  • https://blockdmask.tistory.com/23
  • https://man7.org/linux/man-pages/man7/signal.7.html