【问题标题】:Signal Handling inside class类内信号处理
【发布时间】:2016-06-16 03:00:24
【问题描述】:

我在使用 signal 函数时遇到问题, 我需要第二个参数调用我的类的函数

signal (SIGINT, myClass_function);

但据我所知,它必须是静态无效的。所以我不能访问我的对象的同一个实例来访问我需要的变量

Foo.h

class Foo {
public:
  std::vector<my_struct> vm = std::vector<my_struct>(50);

  static void myClass_function(int parameter) {
    // handling signal here
    // i need to access vm here
  }

};

Foo.cpp

void Foo::something() {
  // call signal
  signal(SIGINT, myClass_function);    
}

如果用户按下 ctrl+c,vector vm 的所有数据都需要清理。没有办法吗?谁能帮帮我?

【问题讨论】:

  • 帮你什么?您对信号处理程序如何工作的理解是绝对正确的。当进程接收到信号时,信号处理程序会被异步调用。就是这样。而已。一点也不差。信号处理程序不仅没有获取任何其他类型的参数,它也不能调用任何不可重入的库函数或代码。信号处理程序的所有工作,就是它是作为信号的结果被调用的。由信号处理程序来确定它需要什么以及从哪里获取它。
  • 当有信号时,信号处理器应该使用Foovm
  • 在这篇文章中查看 Luc Touraille 的答案:Is it possible to use signal inside a C++ class?
  • 我试过这个,他建议的第二种可能性。但是编译时出现以下错误:“ undefined reference to class::instance”
  • 你需要定义 class::instance。链接的答案未显示如何执行此操作。

标签: c++ linux signal-handling


【解决方案1】:

解决方案可以声明为处理正确实例的 Singleton Wrapper。我根据 Luc Touraille 的想法提出了下一个代码:

#include <iostream>
#include <signal.h>


class Foo;


class Wrap {
    Foo* foo;

    Wrap() = default;

public:
    static Wrap& getInstance() {
        static Wrap* w = new Wrap();
        return *w;
    }

    void set(Foo* foo_) {
        foo = foo_;  
    }

    Foo* get() {
        return foo;   
    }
};


class Foo {
    int x;

public:
    Foo(int x_)
        : x(x_) { }

    void something() {
        // call signal
        static Wrap& w = Wrap::getInstance();
        w.set(this);
        signal(SIGINT, Foo::myHandler);
        raise(SIGINT);
    }

    static void myHandler(int parameter) {
        static Wrap& w = Wrap::getInstance();
        fprintf(stderr, "%d  %d\n", w.get()->x, parameter);
    }
};

int main() {
    Foo f(10);
    Foo f2(100);
    f.something();
    f2.something();
}

输出:

10  2
100  2

我建议你这样做,如果你想要几个 Foo 实例。另一方面,如果只需要 Foo 的实例,则不需要 Singleton Wrap,Foo 应该是 Singleton。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-31
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    相关资源
    最近更新 更多