请随意评论以下包装来源的准确性/有效性 用于使用新的POSIX sigaction API处理信号。如果你觉得我做错了什么或有潜在的危险,请加入。
注意:syserr是一个未显示的自定义函数,可以正常退出。
THX。
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <string.h>
#include <errno.h>
static struct sigaction *
handle_signal(int sig,
int flags,
void (*handler)())
{
static struct sigaction action;
static struct sigaction o_action;
/* init the sigaction structs */
memset(&action, 0, sizeof(action));
memset(&o_action, 0, sizeof(o_action));
/* setup our signal handler function to call when it fires */
action.sa_handler = handler;
/* initialize the signal mask */
sigemptyset(&action.sa_mask);
/* use the user passed in flags setting othersize init them */
if (flags != 0)
action.sa_flags = flags;
else
action.sa_flags = 0;
if (sigaction(sig, &action, &o_action) != 0)
syserr();
return(&o_action);
}
static struct sigaction *
ignore_signal(int sig)
{
static struct sigaction action;
static struct sigaction o_action;
/* init the sigaction structs */
memset(&action, 0, sizeof(action));
memset(&o_action, 0, sizeof(o_action));
/* setup to ignore this signal */
action.sa_handler = SIG_IGN;
/* initialize the signal mask */
sigemptyset(&action.sa_mask);
action.sa_flags = 0;
if (sigaction(sig, &action, &o_action) != 0)
syserr();
return(&o_action);
}
int
block_signal(int sig)
{
static sigset_t mask;
static sigset_t orig_mask;
int ret;
sigemptyset(&mask);
sigemptyset(&orig_mask);
sigaddset(&mask, sig);
ret = sigprocmask(SIG_BLOCK, &mask, &orig_mask);
return(ret);
}
int
unblock_signal(int sig)
{
static sigset_t mask;
static sigset_t orig_mask;
int ret;
sigemptyset(&mask);
sigemptyset(&orig_mask);
sigaddset(&mask, sig);
ret = sigprocmask(SIG_UNBLOCK, &mask, &orig_mask);
return(ret);
}
sigset_t *
get_signal_mask()
{
static sigset_t orig_mask;
sigemptyset(&orig_mask);
/* null in set arg means return current mask */
if (sigprocmask(SIG_SETMASK, NULL, &orig_mask) < 0)
syserr();
return(&orig_mask);
}