我不是C++专家,我试图创建一个类来处理终端上的ctrl+C。
在我开始将它们移到SignalHandler类之前,我的方法是工作的。
看起来,我无法将sigaction.sa_action设置为:
sigIntHandler.sa_handler = SomeClass->someMethod(int s);就像我在C。
sigIntHandler.sa_handler = someMethod(int s);编译器说:
signals.cpp: In constructor ‘SignalHandler::SignalHandler()’:
signals.cpp:5:39: error: invalid use of non-static member function
registerSignalHandler(ctrlCHandler);
^我的代码怎么了?
我想我必须把我的类成员函数转换成这样的东西:(*sa_handler)(int)。
cpp文件:
#include "signals.h"
SignalHandler::SignalHandler() {
isSigtermReceived = false;
registerSignalHandler(ctrlCHandler);
}
SignalHandler::~SignalHandler() {
}
// private
void SignalHandler::registerSignalHandler(void (*handler)(int)){
struct sigaction sigIntHandler;
sigIntHandler.sa_handler = handler;
sigemptyset(&sigIntHandler.sa_mask);
sigIntHandler.sa_flags = 0;
sigaction(SIGINT, &sigIntHandler, NULL);
}
void SignalHandler::ctrlCHandler (int s) {
using namespace std;
cout << endl << "Caught signal " << s << ". Exiting." << endl;
isSigtermReceived = true;
}H档案:
#ifndef SIGNALS_H
#define SIGNALS_H
#include <signal.h> // ctrl-c
#include <iostream>
class SignalHandler {
public:
SignalHandler();
virtual ~SignalHandler();
bool isSigtermReceived;
void registerSignalHandler(void (*hnd)(int));
private:
void ctrlCHandler(int s);
};
#endif /* SIGNALS_H */这是一个结构,我正在尝试分配sa_handler字段:
struct sigaction {
void (*sa_handler)(int);
void (*sa_sigaction)(int, siginfo_t *, void *);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer)(void);
};(http://man7.org/linux/man-pages/man2/sigaction.2.html)
发布于 2019-01-31 19:17:31
不能将成员函数转换为函数指针。
尽管有实际的语义,但您可以仅仅认为一个成员函数有一个隐藏的this引用,它不能作为一个空闲函数指针传递。
最简单的解决办法是使用桥梁方法来解决这个问题,例如:
class SignalHandlerDispatcher {
private:
static SignalHandler* _handler;
public:
static void setHandler(SignalHandler* handler) { _handler = handler; }
static void sa_handler(int v) { _handler->SomeMethod(v); }
};所以现在您可以使用SignalHandlerDispatcher::sa_handler作为回调,因为它是static。
https://stackoverflow.com/questions/54467652
复制相似问题