Linuxでシグナル捕捉
使い方をすぐに忘れるsigactionでシグナルを捕捉する方法。
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <signal.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
static volatile sig_atomic_t RecvSigno = 0;
void signal_handler(int signo)
{
RecvSigno = signo;
}
int main(void)
{
struct sigaction sigact = {
.sa_handler = signal_handler,
.sa_flags = 0,
};
uint8_t siglist[] = {
SIGINT,
SIGTERM,
SIGQUIT,
SIGCHLD,
SIGPIPE,
};
sigemptyset(&sigact.sa_mask);
for(int entry = 0; entry < sizeof(siglist); entry++) {
if(sigaction(siglist[entry], &sigact, NULL) < 0) {
int errcode = errno;
char strerr[64] = {0};
strerror_r(errcode, strerr, sizeof(strerr));
printf("sigaction() failed(%s)\n", strerr);
}
}
while (1) {
if (RecvSigno != 0) {
printf("Recieved signal(%d)\n", RecvSigno);
RecvSigno = 0;
}
sleep(1);
}
return 0;
}
実行結果
$ gcc -o signal -std=gnu99 signal.c
$ ./signal
^CRecieved signal(2) # Ctrl+C実行
Hangup # 別端末からkill -SIGHUP <pid>を実行
$
新規のプログラムはsignal(2)ではなくsigaction(2)を使うことが推奨される。
シグナルの扱いについてはMan page of SIGNAL参照。
コメント