Linux - 信号:错误:非静态成员函数的使用无效
Posted
技术标签:
【中文标题】Linux - 信号:错误:非静态成员函数的使用无效【英文标题】:Linux - signal: error: invalid use of non-static member function 【发布时间】:2020-04-27 10:19:25 【问题描述】:我最初为我的程序编写了一些测试来测试信号的功能。测试证明是有希望的,但是在我的源代码中将小的代码更改移动到我的类给我带来了一些问题。
我添加了两个函数: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 以从我的班级中删除,但现在我收到了:
error: invalid conversion from ‘int (*)(int)’ to ‘__sighandler_t aka void (*)(int)’ [-fpermissive]
signal(SIGALRM, alarm_handler);
^
【问题讨论】:
【参考方案1】:信号处理函数 (alarm_handler
) 不能是成员函数,应该是具有 C 链接的独立函数。
从你的班级中删除它:
void alarm_handler(int signum)
dbExecSql();
请注意,只有async-signal-safe 函数可以安全地从信号处理程序中调用。所以你需要确保dbExecSql()
尊重这一点。
【讨论】:
谢谢,很高兴知道!我做了你推荐的改变,但没有得到:错误:从'int()(int)'到'__sighandler_t aka void()(int)'[-fpermissive]信号的无效转换(SIGALRM,alarm_handler); ^ 看来你有int
返回类型(alarm_handler
)。应该是void
。
编码 98% 的时间让我想哭。非常感谢队友以上是关于Linux - 信号:错误:非静态成员函数的使用无效的主要内容,如果未能解决你的问题,请参考以下文章