Linux - signal: error: invalid use of non-static member function
Linux - signal: error: invalid use of non-static member function
我最初编写了一些测试来测试我程序的信号功能。测试证明很有希望,但是将小代码更改移动到我的源代码中的 class 给我带来了一些问题。
我添加了两个函数:setAlarm()
和一个回调 alarm_handler
。 setAlarm()
照它说的做,也就是设置闹钟。一旦时间到期,将调用运行执行函数的警报处理程序。
a.cpp
int Database::alarm_handler(int signum)
{
dbExecSql();
}
void Database::setAlarm()
{
signal(SIGALRM, alarm_handler);
ualarm(500000,0);
}
b.h
class Database
{
public:
int alarm_handler(int signum);
void setAlarm();
dbExecSql();
};
错误
error: invalid use of non-static member function
signal(SIGALRM, alarm_handler);
如有任何帮助,我们将不胜感激。
编辑
我已将 alarm_handler 修改为从我的 class 中删除,但我现在收到:
error: invalid conversion from ‘int (*)(int)’ to ‘__sighandler_t {aka void (*)(int)}’ [-fpermissive]
signal(SIGALRM, alarm_handler);
^
信号处理函数 (alarm_handler
) 不能是成员函数,应该是具有 C 链接的独立函数。
将其从您的 class 中删除:
void alarm_handler(int signum)
{
dbExecSql();
}
请注意,只有 async-signal-safe 函数可以从信号处理程序中安全调用。所以你需要确保 dbExecSql()
尊重这一点。
我最初编写了一些测试来测试我程序的信号功能。测试证明很有希望,但是将小代码更改移动到我的源代码中的 class 给我带来了一些问题。
我添加了两个函数:setAlarm()
和一个回调 alarm_handler
。 setAlarm()
照它说的做,也就是设置闹钟。一旦时间到期,将调用运行执行函数的警报处理程序。
a.cpp
int Database::alarm_handler(int signum)
{
dbExecSql();
}
void Database::setAlarm()
{
signal(SIGALRM, alarm_handler);
ualarm(500000,0);
}
b.h
class Database
{
public:
int alarm_handler(int signum);
void setAlarm();
dbExecSql();
};
错误
error: invalid use of non-static member function
signal(SIGALRM, alarm_handler);
如有任何帮助,我们将不胜感激。
编辑
我已将 alarm_handler 修改为从我的 class 中删除,但我现在收到:
error: invalid conversion from ‘int (*)(int)’ to ‘__sighandler_t {aka void (*)(int)}’ [-fpermissive]
signal(SIGALRM, alarm_handler);
^
信号处理函数 (alarm_handler
) 不能是成员函数,应该是具有 C 链接的独立函数。
将其从您的 class 中删除:
void alarm_handler(int signum)
{
dbExecSql();
}
请注意,只有 async-signal-safe 函数可以从信号处理程序中安全调用。所以你需要确保 dbExecSql()
尊重这一点。