问题
很多时候,进程之间会使用信号,来进行进程间通信。
但是一般信号处理函数的默认动作,就是退出进程。
如果进程,在初始化信号处理函数的过程中就接收到了信号,就会退出。
因此正确的初始化信号处理函数,就显得很重要。
一般的方法
一般将初始化信号处理函数 real_time_signal_setup()
作为 main()
的第一个调用函数。就可以减少很多的问题。
static
void signal_handler(int sig)
{
/* do something */
}
static
void real_time_signal_setup(void) {
#define REAL_TIME_SIGNAL_BEGIN (34)
#define REAL_TIME_SIGNAL_END (64)
int sig;
for (sig = REAL_TIME_SIGNAL_BEGIN; sig <= REAL_TIME_SIGNAL_END; ++sig) {
signal(sig, signal_handler);
}
}
int main(int argc, char **argv)
{
real_time_signal_setup(); /* this should be the first line */
/* ... */
return 0;
}
更好的方法
但是,初始化信号处理函数 real_time_signal_setup()
总是会消耗一定的时间。
如果初始化还没有完成,此时一旦接收到信号,就会出现问题。
更好的办法。就是让 real_time_signal_setup()
函数,跑在 main()
函数的前面。
这里就利用了 gcc 的一个 attribute((constructor)) 属性。
static
void signal_handler(int sig)
{
/* do something */
}
__attribute__((constructor(101))) /* <-- make `real_time_signal_setup()` run before `main()` */
static
void real_time_signal_setup(void) {
#define REAL_TIME_SIGNAL_BEGIN (34)
#define REAL_TIME_SIGNAL_END (64)
int sig;
for (sig = REAL_TIME_SIGNAL_BEGIN; sig <= REAL_TIME_SIGNAL_END; ++sig) {
signal(sig, signal_handler);
}
}
int main(int argc, char **argv)
{
/* ... */
return 0;
}