假设我有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)'
知道为什么吗?
答案 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);