gpt4 book ai didi

c++ - 捕捉信号 : Use a member function as signal handler

转载 作者:IT王子 更新时间:2023-10-29 00:19:43 25 4
gpt4 key购买 nike

我有一个对象,它在无限循环中做一些工作。 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) 对于那些想知道“那个人在做什么?”的人:您有什么建议可以更好地解决这类问题吗?

最佳答案

  • What do I need to change to make this work? I think f is like void f(int), like the functions the signal handler gets in some examples.

编译器会提示该类型,因此您需要传递一个函数指针,而不是 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();

}
  • Do you have any advice how to solve this kind of thing better?

不是真的。这个想法是好的。我只想用 c++11 lambda 代替

关于c++ - 捕捉信号 : Use a member function as signal handler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12857101/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com