Linux - 信号:错误:非静态成员函数的使用无效

Posted

技术标签:

【中文标题】Linux - 信号:错误:非静态成员函数的使用无效【英文标题】:Linux - signal: error: invalid use of non-static member function 【发布时间】:2020-04-27 10:19:25 【问题描述】:

我最初为我的程序编写了一些测试来测试信号的功能。测试证明是有希望的,但是在我的源代码中将小的代码更改移动到我的类给我带来了一些问题。

我添加了两个函数:setAlarm(),以及一个回调函数alarm_handlersetAlarm() 照它说的做,设置了警报。一旦时间到期,就会调用警报处理程序,该处理程序会运行一个执行函数。

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 - 信号:错误:非静态成员函数的使用无效的主要内容,如果未能解决你的问题,请参考以下文章

QtConcurrent 错误:对非静态成员的引用

具有类名的数据成员

错误分析:非静态成员引用必须与特定对象相对

C++ 非静态成员函数的非法调用

非静态成员作为非静态成员函数的默认参数[重复]

使用 C++ 的 Array 中的非静态成员引用错误