意識低い系会社員

意識低い系会社員の日常

【スポンサーリンク】

ふつうのLinuxプログラミング 第2版の内容memo(13章)

【スポンサーリンク】

 

こんにちは。

 

最近、ふつうのLinuxプログラミング 第2版を読んでいるので知識の定着のために学んだ内容を要約したメモを書きます。

このエントリは完全な個人のメモです。

 

お勉強のためにこの本を読んでいるので、内容を覚えるためにSummarizing(サマライジング)を行います。

 

12章の内容はこちら。

amistad06-a.hatenablog.com

 

シグナルに関わるAPI

この章で説明すること

シグナルの概念やプログラムでの補足のしかた、送信の仕方を説明します。

 

シグナルとは

ユーザーやカーネルが、プロセスに対して何かを通知するための機能です。

シグナルにはSIGINTやSIGHUP、SIGKILLなどがあります。

SIGKILL以外のシグナルはプログラムで補足可能です。

sigaction(2)を使えばシグナルを補足したときの動作を変更することができる。

 

コアダンプ

SIGSEGV、SIGBUS、SIGFPEが補足されたときのデフォルト動作はコアダンプしてプログラムを終了します。

コアダンプとはメモリダンプのこと。

昔はメモリに磁気コアというものを使っていたらしいのでその名残らしいです。

 

signal(2)

シグナルを補足するシステムコール。

ハンドラの再設定やシステムコールの再起動、リエントラントではない関数の呼び出し、シグナルのブロックなど多くの問題があるので非推奨。

 

sigaction(2)

signal(2)はあまりにも使い勝手が悪いので基本はこちらを使用する。

signal(2)の問題の多くが考慮されたシステムコール。

 

関数ポインタ

シグナルハンドラの説明のために関数ポインタの説明もありました。

関数名で関数の先頭ポインタが取得できます。

 

sigset_t操作API

sigemptyset()などの簡単な紹介。

 

シグナルのブロック

シグナルのブロックはsigactionのsa_maskで行います。

 

シグナルの送信

プログラムからシグナルを送信するときにはkill(2)を使います。

 

Ctrl+Cでシグナルが送信される仕組みの説明

端末ドライバが中で色々頑張ってくれるらしい。

 

演習問題

SIGINTシグナルを受けたらメッセージを出力して終了するプログラムを書きなさい。シグナルを待つにはpause()というAPIが使えます。

 

作ったプログラムは以下。

#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>

void signal_handler(){
    fprintf(stdout, "received signal.\n");
    exit(0);
}

int main(){
    // register signal handler
    struct sigaction act;
    act.sa_handler = signal_handler;
    sigemptyset(&act.sa_mask);
    act.sa_flags = SA_RESTART;
    if(sigaction(SIGINT, &act, NULL) < 0){
        fprintf(stderr, "sigaction failed.\n");
        return 0;
    }

    fprintf(stdout, "waiting signal...\n");
    pause();
}

 

実行結果は以下。

$ ./a.out 
waiting signal...
^Creceived signal.
$ 

 

まとめ

13章の内容はこんな感じです。

14章の内容はこちら。

amistad06-a.hatenablog.com

 

おわり。

 

【スポンサーリンク】