课堂内的信号处理

时间:2016-06-16 03:00:24

标签: c++ linux signal-handling

我遇到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,矢量vm的所有数据都需要清理。没办法那样做?有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:1)

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

var clicked = false;

function clickAndDisable(e)
{
    alert("Entered clickAndDisable function");
    if (clicked)
    {
        e.preventDefault();
    }
    else
    {
        clicked = true;
    }
}

document.getElementById('link').attachEventListener('click', clickAndDisable);

输出:

#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();
}

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