トップ 最新 追記

Cocoa練習帳

iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど

2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|

2024-04-01 [UNIX] シグナル

シグナルはソフトウェア割り込みで、ある条件が生起したことをプロセスに通知する仕組みです。

シグナルを扱う最も簡素な関数はsignal.hで定義されているsignal関数です。

void (*signal(int sig, void (*handler)(int)))(int)

4.4BSDでは信頼できるsigaction関数を利用すべきですが、signal関数はプラットフォームに依存しないのと、単純ですので、signal関数を使っています。

以下はシグナルの例です。

SIGABRT 異常終了。abortなど。
SIGFPE 異常算術エラー。ゼロ割算やオーバーフローなど。
SIGILL 不当な関数イメージ。不当命令など。
SIGINT 対話的なアテンション。割り込みなど。
SIGSEGV 不当な記憶アクセス。メモリ領域外へのアクセスなど。
SIGTERM プログラムに対する終了要求。

簡単な例です。

#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
 
static void onintr(int);
 
int main(int argc, char *argv[])
{
    if (signal(SIGINT, SIG_IGN) != SIG_IGN)
        signal(SIGINT, onintr);
 
    for (;;)
        sleep(1);
    exit(0);
}
 
static void onintr(int signo)
{
    if (signo == SIGINT)
        printf("received SIGINT\n");
    exit(1	);
}

これをビルドして実行すると無限ループするので、Ctrl+Cで中断させる。するとSIGINTを受け取って、コンソールにreceived SIGINTが印字される。


$ cc onintr.c -o onintr
$ ./onintr
^Creceived SIGINT
$ 

トップ 最新 追記