Поймать сигналы: использовать функцию-член в качестве обработчика сигнала
У меня есть объект, который выполняет некоторую работу в бесконечном цикле.main()
создает объект и вызываетrun()
метод. Поскольку я не хочу использовать потоки, мне нужно решение, чтобы мой объект перестал работать. Ниже вы видите, что я придумал.
struct Foo
{
void run()
{
running = 1;
while (running)
do_something_useful();
std::cout << "Execution stopped." << std::endl;
}
bool running;
void catch_signal(int signal)
{
std::cout << "Caught signal " << signal << std::endl;
if( signal == SIGTERM )
running = false;
}
};
Как видите, мне нужно отправить сигнал асинхронно. Поэтому я использую обработчик сигнала иsigaction
, Нижеmain
Я могу представить, чтобы использовать.
int main(int argc, char** argv)
{
Foo foo;
struct sigaction sigIntHandler;
boost::function< void (int) > f;
f = std::bind1st(
std::mem_fun(&Foo::catch_signal), &foo);
f(5); // this call works
sigIntHandler.sa_handler = f; // compiler complains, "cannot assign ..."
sigemptyset(&sigIntHandler.sa_mask);
sigIntHandler.sa_flags = 0;
sigaction(SIGTERM, &sigIntHandler, NULL);
s.run();
}
Что бы я ожидал сейчас: программа работает, пока я не отправлюSIGTERM
который пойман и заставит мой объект остановить итерацию и вернуться к основному.
У меня сейчас два вопроса:
(а) В коде вы видите строку, помеченную «Жалобы компилятора», сообщение выглядит так:
boost::function<void(int)> cannot be converted to __sighandler_t {aka void (*)(int)}
Что мне нужно изменить, чтобы сделать эту работу? думаюf
какvoid f(int)
Как и функции, получаемые обработчиком сигнала в некоторых примерах.
(б) Для тех из вас, кто задается вопросом «что делает этот парень?»: есть ли у вас какие-либо советы, как лучше решить эту проблему?