[英]Catching signals: Use a member function as signal handler
我有一个在无限循环中做一些工作的对象。 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
并且将导致我的对象停止迭代并返回到main。
我现在有两个问题:
(a)在代码中,您看到标有“Compiler complains”的行,消息就像
boost::function<void(int)> cannot be converted to __sighandler_t {aka void (*)(int)}
为了使这项工作,我需要改变什么? 我认为f
就像void f(int)
,就像信号处理程序在一些例子中得到的函数一样。
(b)对于那些想知道“那个人在做什么?”的人:你有什么建议如何更好地解决这类问题?
- 为了使这项工作,我需要改变什么? 我认为f就像void f(int),就像信号处理程序在一些例子中得到的函数一样。
编译器抱怨类型,因此您需要传递函数指针,而不是boost::function<void(int)>
类型的对象。 创建此类型的全局变量,并添加一个调用此对象的函数将起作用:
boost::function<void(int)> myCb;
void CallCb( int value )
{
myCb(value);
}
int main(int argc, char** argv)
{
Foo foo;
struct sigaction sigIntHandler;
myCb = std::bind1st(
std::mem_fun(&Foo::catch_signal), &foo);
f(5); // this call works
sigIntHandler.sa_handler = CallCb;
sigemptyset(&sigIntHandler.sa_mask);
sigIntHandler.sa_flags = 0;
sigaction(SIGTERM, &sigIntHandler, NULL);
s.run();
}
- 你对如何更好地解决这类问题有什么建议吗?
并不是的。 这个想法没问题。 我只想改变c ++ 11 lambda
您可以在信号处理程序中轻松地进行操作。 基本上,您可以将值存储在类型为sig_atomic_t
的对象中。 例如,插入cout
不一定有效。 如果你有C ++ 11,你可以使用原子类型或显式围栏做更多的事情,但是对标准库的任何其他调用都不需要做任何合理的事情。
所以,尽管如此,你可以做的是编写一个函数(自由函数或静态成员函数)(但这里有一个微妙的问题,C ++链接:正式的静态成员函数不起作用,但在实践中它始终会))调用成员函数,而成员函数又将running
设置为false
(假设您已将running
类型更改为sig_atomic_t
)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.