2022-09-13 分享rtpproxy中处理信号signal的代码片段

  • 写在开头:
    开发Linux后台程序,为保证运行,必须要对相关的信号(signal)进行处理,甚至在发生异常时,可以打印相关的堆栈信息;
  • 使用man手册,查看signal相关说明;
    在这里插入图片描述

rtpproxy是一个成熟的RTP代理,阅读源码可以使自己的水平得到提升,下面分享一下rtpproxy的源码main.c中,对于信号(signal)的一些处理;

#include <sys/types.h>
#include <signal.h>
#include <stdio.h>
#include <unistd.h>

#include "libexecinfo/execinfo.h"




void
rtpp_stacktrace(int sig)
{
    /* Obtain a backtrace and print it to stderr. */
    void *array[10];
    size_t size;
    char **strings;
    int i;

    size = backtrace(array, 10);
    strings = backtrace_symbols(array, size);

    fprintf(stderr, "Died on signal %d, obtained %lu stack frames.\n",
      sig, (unsigned long)size);

    for (i = 0; i < size; i++)
        fprintf(stderr, "%s\n", strings[i]);
    fflush(stderr);
    signal(sig, SIG_DFL);
    kill(getpid(), sig);
}

void
rtpp_stacktrace_print(const char *msg)
{
    /* Obtain a backtrace and print it to stderr. */
    void *array[10];
    size_t size;
    char **strings;
    int i;

    size = backtrace(array, 10);
    strings = backtrace_symbols(array, size);

    fprintf(stderr, "%s\nTraceback:\n", msg);
    for (i = 0; i < size; i++)
        fprintf(stderr, "  %s\n", strings[i]);
    fflush(stderr);
}

static void
fatsignal(int sig)
{

    RTPP_LOG(_sig_cf->stable->glog, RTPP_LOG_WARN, "got signal %d", sig);
#if 0
    if (_sig_cf->stable->fastshutdown == 0) {
        _sig_cf->stable->fastshutdown = 1;
        return;
    }
#endif
    /*
     * Got second signal while already in the fastshutdown mode, something
     * probably jammed, do quick exit right from sighandler.
     */
    rtpp_exit(1, 0);
}



static void
sighup(int sig)
{

    if (_sig_cf->stable->slowshutdown == 0) {
        RTPP_LOG(_sig_cf->stable->glog, RTPP_LOG_INFO,
          "got SIGHUP, initiating deorbiting-burn sequence");
    }
    _sig_cf->stable->slowshutdown = 1;
}

int main(int argc, char* argv[])
{
    signal(SIGHUP, sighup);
    signal(SIGINT, fatsignal);
    signal(SIGKILL, fatsignal);
    signal(SIGPIPE, SIG_IGN);
    signal(SIGTERM, fatsignal);
    signal(SIGXCPU, fatsignal);
    signal(SIGXFSZ, fatsignal);
    signal(SIGVTALRM, fatsignal);
    signal(SIGPROF, fatsignal);
    signal(SIGUSR1, fatsignal);
    signal(SIGUSR2, fatsignal);
#if RTPP_DEBUG_catchtrace
    signal(SIGQUIT, rtpp_stacktrace);
    signal(SIGILL, rtpp_stacktrace);
    signal(SIGTRAP, rtpp_stacktrace);
    signal(SIGABRT, rtpp_stacktrace);
#if defined(SIGEMT)
    signal(SIGEMT, rtpp_stacktrace);
#endif
    signal(SIGFPE, rtpp_stacktrace);
    signal(SIGBUS, rtpp_stacktrace);
    signal(SIGSEGV, rtpp_stacktrace);
    signal(SIGSYS, rtpp_stacktrace);
#endif


    //.........其他代码...............

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShaYQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值