- 写在开头:
开发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;
}