美文网首页
sigaction的使用

sigaction的使用

作者: jiangling500 | 来源:发表于2019-05-04 15:37 被阅读0次

sigaction结构体定义

struct sigaction
{
    void (*sa_handler)(int);
    void (*sa_sigaction)(int, siginfo_t*, void*);
    sigset_t sa_mask;
    int sa_flags;
};
  • sa_handler:信号处理器函数的地址,亦或是常量SIG_IGNSIG_DFL之一。仅当sa_handler是信号处理程序的地址时,亦即sa_handler的取值在SIG_IGNSIG_DFL之外,才会对sa_masksa_flags字段加以处理。
  • sa_sigaction:如果设置了SA_SIGINFO标志位,则会使用sa_sigaction处理函数,否则使用sa_handler处理函数。
  • sa_mask:定义一组信号,在调用由sa_handler所定义的处理器程序时将阻塞该组信号,不允许它们中断此处理器程序的执行。
  • sa_flags:位掩码,指定用于控制信号处理过程的各种选项。
    • SA_NODEFER:捕获该信号时,不会在执行处理器程序时将该信号自动添加到进程掩码中。
    • SA_ONSTACK:针对此信号调用处理器函数时,使用了由sigaltstack()安装的备选栈。
    • SA_RESETHAND:当捕获该信号时,会在调用处理器函数之前将信号处置重置为默认值(即SIG_IGN)。
    • SA_SIGINFO:调用信号处理器程序时携带了额外参数,其中提供了关于信号的深入信息

使用示例一(使用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)

// 设置信号处理
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
}

对段错误等致命信号的处理

当接收到段错误等致命信号时,可以先捕获该信号,做一些处理,比如保存调用堆栈信息等,再向进程发送该信号,确保程序能够以正常方式结束,比如设置生成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);

参考

相关文章

  • sigaction的使用

    sigaction结构体定义 sa_handler:信号处理器函数的地址,亦或是常量SIG_IGN、SIG_DFL...

  • 信号处理函数

    信号处理函数 sigaction的用法 int sigaction ( int signo, const stru...

  • struct sigaction

    主要在sigaction信号安装sigqueue信号发送时会用到。 struct sigaction { vo...

  • linux手册翻译——sigaction(2)

    sigaction, rt_sigaction - 检查和修改信号的Action(这里的Action语义同sign...

  • APUE读书笔记-10信号(9)

    14、sigaction函数 sigaction允许我们检查或修改,或者检查并修改和一个特定信号相关联的动作。这个...

  • sigaction函数

    概述信号是与一定的进程相联系的。也就是说,一个进程可以决定在进程中对哪些信号进行什么样的处理。例如,一个进程可以忽...

  • sigaction函数

    该函数补充signal函数的缺陷,对signal的扩展,signal不知道谁发的信号|#include int ...

  • Linux信号处理相关API介绍

    信号处理 signal和signaction函数,signal是最原始的API,提供的接口比sigaction简单...

  • Linux进程间通信- signal信号的捕捉与sigactio

    Linux进程间通信- signal信号的捕捉与sigaction函数 前面有提到Linux中信号的处理动作是用户...

  • linux-10 -信号(2)+IPC

    信号:信号的发送函数/信号集和信号屏蔽/介绍一个sigaction()/信号应用的相关函数:sleep(),usl...

网友评论

      本文标题:sigaction的使用

      本文链接:https://www.haomeiwen.com/subject/lvwxoqtx.html