我试图用类中的一个成员函数进行中断处理。
代码是
signal(SIGABRT, socketServer.signalHandler);其中signalHandler的定义是
public:
void SocketServer::signalHandler(int sig)
{
logger.info("Receive SIG"+to_string(sig)+" Stopping server now...");
stop();
}当我编译代码时,我得到了一个错误:
main.cpp:32:32: error: reference to non-static member function must be called
signal(SIGABRT, socketServer.signalHandler);我试图使用这个SIGABRT函数捕获signalHandler,并清理和停止socketServer实例。我想我可以使用全局变量和全局函数来完成这项工作,但是对于使用成员函数来完成这个任务,有什么想法吗?
发布于 2015-12-15 21:51:34
不,你可以而不是来做这个。
原因是所有成员函数都有一个“隐含/隐藏”的this指针参数。如果我们将处理程序定义“扁平化”以生成C等价物,则如下所示:
void SocketServer::signalHandler(SocketServer *this,int sig);C中的signal函数对这个双关语一无所知。如果它编译了,处理程序将被调用,sig将进入this参数,而不是sig参数。
所以,你真的必须:
SocketServer my_global_server;
void
my_handler(int sig)
{
my_global_server.signalHandler(sig);
}
int
main(void)
{
signal(SIGABRT,my_handler);
return 0;
}实际上,上述情况非常危险,因为当调用信号处理程序时,my_global_server可能处于不确定状态,从而导致UB。此外,在信号处理程序中,允许您做的事情数量有限。例如,不允许堆操作。
这里有一个更好的方法来实现这一点:
volatile int signal_flag;
SocketServer my_global_server;
void
my_handler(int sig)
{
signal_flag = sig;
}
int
main(void)
{
signal(SIGABRT,my_handler);
while (! signal_flag) {
...
}
my_global_server.signalHandler(signal_flag);
return 0;
}https://stackoverflow.com/questions/34299689
复制相似问题