【问题标题】:Linux - signal: error: invalid use of non-static member functionLinux - 信号:错误:非静态成员函数的使用无效
【发布时间】: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);
                                  ^

【问题讨论】:

    标签: c++ linux asynchronous signals


    【解决方案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% 的时间让我想哭。非常感谢队友
    猜你喜欢
    • 2019-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    • 2013-06-27
    • 1970-01-01
    • 2014-06-21
    • 2017-05-19
    相关资源
    最近更新 更多