请求对linux上的信号API的一组包装函数发表评论

时间:2014-04-11 10:58:57

标签: signals posix wrapper

请随意评论以下包装来源的准确性/有效性 用于使用新的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);

}

0 个答案:

没有答案