我有一个在无限循环中做一些工作的对象。实例化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) 在代码中,您会看到标有“编译器抱怨”的行,消息类似于
boost::function<void(int)> cannot be converted to __sighandler_t {aka void (*)(int)}
我需要改变什么才能使这项工作?我认为f
就像void f(int)
信号处理程序在某些示例中获得的功能一样。
(b) 对于那些想知道“那个家伙在做什么?”的人:你有什么建议可以更好地解决这种事情吗?