iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど
シグナルはソフトウェア割り込みで、ある条件が生起したことをプロセスに通知する仕組みです。
シグナルを扱う最も簡素な関数は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
$