sigaction結(jié)構(gòu)體定義
struct sigaction
{
void (*sa_handler)(int);
void (*sa_sigaction)(int, siginfo_t*, void*);
sigset_t sa_mask;
int sa_flags;
};
-
sa_handler
:信號(hào)處理器函數(shù)的地址票渠,亦或是常量SIG_IGN
佩番、SIG_DFL
之一逮刨。僅當(dāng)sa_handler
是信號(hào)處理程序的地址時(shí),亦即sa_handler的取值在SIG_IGN
和SIG_DFL
之外斥废,才會(huì)對(duì)sa_mask
和sa_flags
字段加以處理。 -
sa_sigaction
:如果設(shè)置了SA_SIGINFO
標(biāo)志位佳遂,則會(huì)使用sa_sigaction
處理函數(shù)营袜,否則使用sa_handler
處理函數(shù)。 -
sa_mask
:定義一組信號(hào)丑罪,在調(diào)用由sa_handler
所定義的處理器程序時(shí)將阻塞該組信號(hào)荚板,不允許它們中斷此處理器程序的執(zhí)行。 -
sa_flags
:位掩碼吩屹,指定用于控制信號(hào)處理過程的各種選項(xiàng)跪另。-
SA_NODEFER
:捕獲該信號(hào)時(shí),不會(huì)在執(zhí)行處理器程序時(shí)將該信號(hào)自動(dòng)添加到進(jìn)程掩碼中煤搜。 -
SA_ONSTACK
:針對(duì)此信號(hào)調(diào)用處理器函數(shù)時(shí)免绿,使用了由sigaltstack()
安裝的備選棧。 -
SA_RESETHAND
:當(dāng)捕獲該信號(hào)時(shí)擦盾,會(huì)在調(diào)用處理器函數(shù)之前將信號(hào)處置重置為默認(rèn)值(即SIG_IGN
)嘲驾。 -
SA_SIGINFO
:調(diào)用信號(hào)處理器程序時(shí)攜帶了額外參數(shù),其中提供了關(guān)于信號(hào)的深入信息
-
使用示例一(使用sa_handler)
void setupSignalHandlers(void)
{
struct sigaction act;
sigemptyset(&act.sa_mask);
act.sa_flags = SA_NODEFER | SA_ONSTACK | SA_RESETHAND;
act.sa_handler = sigtermHandler;
sigaction(SIGTERM, &act, NULL);
return;
}
static void sigtermHandler(int sig)
{
// TODO
}
使用示例二(使用sa_sigaction)
// 設(shè)置信號(hào)處理
void setupSignalHandlers(void)
{
struct sigaction act;
sigemptyset(&act.sa_mask);
act.sa_flags = SA_NODEFER | SA_ONSTACK | SA_RESETHAND | SA_SIGINFO;
act.sa_sigaction = sigsegvHandler;
sigaction(SIGSEGV, &act, NULL);
return;
}
static void sigsegvHandler(int sig, siginfo_t *info, void *secret)
{
// TODO
}
對(duì)段錯(cuò)誤等致命信號(hào)的處理
當(dāng)接收到段錯(cuò)誤等致命信號(hào)時(shí)迹卢,可以先捕獲該信號(hào)辽故,做一些處理,比如保存調(diào)用堆棧信息等腐碱,再向進(jìn)程發(fā)送該信號(hào)誊垢,確保程序能夠以正常方式結(jié)束,比如設(shè)置生成dump文件等症见。
struct sigaction act;
// TODO
sigemptyset (&act.sa_mask);
act.sa_flags = SA_NODEFER | SA_ONSTACK | SA_RESETHAND;
act.sa_handler = SIG_DFL;
sigaction (sig, &act, NULL);
kill(getpid(),sig);
參考
- 《Linux/UNIX系統(tǒng)編程手冊(cè)》
- https://github.com/antirez/redis/tree/2.2