Redian新闻
>
关于在c++ member function里用signal( )
avatar
关于在c++ member function里用signal( )# Programming - 葵花宝典
w*s
1
linux里这个例子
void my_handler (int param)
{
signaled = 1;
my_handler2(...);
}
int main ()
{
signal (SIGINT, my_handler);
}
如果my_handler, my_handler2是c++ member function,那么怎么整?
我老用了巨复杂的办法,奶奶的。。。
avatar
A*i
2
void my_handler (int param)
{
std::unique_ptr ptr (new classImpl(...));
ptr->my_handler(...);
ptr->my_handler2(...);
}
avatar
s*u
3
std::bind()

【在 w*s 的大作中提到】
: linux里这个例子
: void my_handler (int param)
: {
: signaled = 1;
: my_handler2(...);
: }
: int main ()
: {
: signal (SIGINT, my_handler);
: }

avatar
w*s
4
高深

【在 A********i 的大作中提到】
: void my_handler (int param)
: {
: std::unique_ptr ptr (new classImpl(...));
: ptr->my_handler(...);
: ptr->my_handler2(...);
: }

avatar
w*s
5
完整句子怎么写?

【在 s******u 的大作中提到】
: std::bind()
avatar
w*g
7
signal里传进去的不能是成员函数。只能把对象指针放到全局变量里,
然后在sighandler里调用全局变量的方法。
std::bind返回的是个对象,不是函数指针,没法传入signal里。

【在 w*s 的大作中提到】
: linux里这个例子
: void my_handler (int param)
: {
: signaled = 1;
: my_handler2(...);
: }
: int main ()
: {
: signal (SIGINT, my_handler);
: }

avatar
s*u
8
hmm,没错,signal handler只能是函数指针,没法用bind
另外也可以用class static member function,这样不需要另外定义全局变量和free
function,当然这个handler相应的也不知道class的状态了

【在 w***g 的大作中提到】
: signal里传进去的不能是成员函数。只能把对象指针放到全局变量里,
: 然后在sighandler里调用全局变量的方法。
: std::bind返回的是个对象,不是函数指针,没法传入signal里。

avatar
p*o
9
谢大牛,帮我看看这样下面的可以吗?
class A {
public:
void my_handler(int param);
void my_handler2(int param);
};
//member function implementations ...
//In C file:
#include
typedef void (*handler_t)(int);
int main ()
{
A a;
handler_t h1, h2;
h1 = &a.my_handler;
h2 = &a.my_hander2;
signal(SIGINT, h1);
signal(SIGINT, h2);
}

【在 w***g 的大作中提到】
: signal里传进去的不能是成员函数。只能把对象指针放到全局变量里,
: 然后在sighandler里调用全局变量的方法。
: std::bind返回的是个对象,不是函数指针,没法传入signal里。

avatar
A*i
10
这样做是不对的。The types of pointer to member function and pointer to
function are different.
https://isocpp.org/wiki/faq/pointers-to-members
链接里第二个问题给了解法,跟wdong给的一样。

【在 p****o 的大作中提到】
: 谢大牛,帮我看看这样下面的可以吗?
: class A {
: public:
: void my_handler(int param);
: void my_handler2(int param);
: };
: //member function implementations ...
: //In C file:
: #include
: typedef void (*handler_t)(int);

avatar
s*y
11
// A.hpp
class A
{
public:
A();
~A();
static void my_handler(int param);
private:
void handler(int param);
static A *pMe;
};
// A.cpp
static A::pMe = 0;
A::A()
{
pMe = this;
}
A::~A()
{
}
void A::my_handler(int param)
{
if (0 != pMe)
{
pMe = new A();
}
if (0 != pMe)
{
pMe->handler(param);
}
}
void A::handler(int param)
{
// handle the param here
}
//In C file:
#include
#include "A.hpp"
int main ()
{
signal(SIGINT, A::my_handler);
}
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。