linux 信号处理函数的初始化

41 篇文章 2 订阅
12 篇文章 0 订阅

问题

很多时候,进程之间会使用信号,来进行进程间通信。
但是一般信号处理函数的默认动作,就是退出进程。
如果进程,在初始化信号处理函数的过程中就接收到了信号,就会退出。
因此正确的初始化信号处理函数,就显得很重要。

一般的方法

一般将初始化信号处理函数 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; 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值