如何将信号处理程序注册为类方法?

时间:2013-12-16 17:42:24

标签: c++ signals boost-bind

假设我有class A,公共方法void f(int sig)。在A的构造函数中,我添加了

signal(SIGSEV, boost::bind(&A::f, this, _1));

这会返回编译错误

error : cannot convert `boost::_bi::bind_t<void, boost::_mfi::mf1<void, A, int>, boost::_bi::list2<boost::_bi::value<A*>, boost::arg<1> > >' to `__sighandler_t {aka void (*)(int)}' for argument `2' to `void (* signal(int, __sighandler_t))(int)'

知道为什么吗?

1 个答案:

答案 0 :(得分:7)

作为C函数,signal只能采用普通函数指针,而不是任意可调用类型。您需要一个非成员包装函数和一个存储this的全局变量,以便从信号处理程序中调用成员函数。

static A * signal_object;
extern "C" void signal_handler(int signum) {signal_object->f(signum);}

// later...
signal_object = this;
signal(SIGSEGV, signal_handler);