c++ - 如何在 C++ 中使用 std::bind 函数作为信号处理程序?

标签 c++ signals stdbind

我正在使用以下代码将信号处理添加到我的 C++ 类中:

namespace {
    std::atomic<bool> signal_flag(false);   
}
void terminate_or_interrupt_handler(int signal) {
    switch (signal) {
        case SIGTERM:
            WARN("SIGTERM received");
            signal_flag.store(true);
            break;
        case SIGINT:
            WARN("SIGINT received");
            signal_flag.store(true);
            break;
        default:
            throw (std::runtime_error("Unhandled signal received"));
    }
}
signal(SIGTERM, &terminate_or_interrupt_handler);

此代码有效,但它需要在与信号标志变量相同的范围内定义信号处理函数。我决定修改代码并通过引用函数传递 signal_flag 并使用 std::bind 将处理程序“专门化”到我的类。

 void terminate_or_interrupt_handler(std::atomic<bool>& signal_flag, int signal) {
    switch (signal) {
        case SIGTERM:
            WARN("SIGTERM received");
            signal_flag.store(true);
            break;
        case SIGINT:
            WARN("SIGINT received");
            signal_flag.store(true);
            break;
        default:
            throw (std::runtime_error("Unhandled signal received"));
    }
}
auto my_handler = std::bind(terminate_or_interrupt_handler, std::ref(my_class_signal_flag), std::placeholders::_1);
signal(SIGTERM, &my_handler);

但是,我得到了这个编译错误:

error: cannot convert ‘std::_Bind<void (*(std::reference_wrapper<std::atomic<bool> >, std::_Placeholder<1>))(std::atomic<bool>&, int)>*’ to ‘__sighandler_t’ {aka ‘void (*)(int)’}

有没有办法将绑定(bind)函数与 C++ 中的 signal 函数结合使用?

最佳答案

std::bind 的结果是一个未指定的函数对象,其类型无法转换为 void (*)(int)。尝试封装它:

void handler_foo(int signal)
{
    return terminate_or_interrupt_handler(signal_flag, signal);
}

或者,如果 C++11 可用,lambda 可能会更好:

signal(SIGTERM, [](int signal) { return terminate_or_interrupt_handler(signal_flag, signal); });

请注意,由于 signal_flag 是一个全局变量( namespace 范围变量),因此不需要捕获。非捕获 lambda 可以隐式转换为相应的函数指针类型。

关于c++ - 如何在 C++ 中使用 std::bind 函数作为信号处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52013007/

相关文章:

c++ - Qt查询Top Number记录选择

c++ - linux安装kde运行时库的问题

c++ - C++ 中的帕斯卡三角形

c++ - I/O 信号和处理程序

python - 如何从 C 扩展引发 Python 异常

c++ - std::bind 和可变参数模板函数

c++ - 在 MFC 按钮的文本上方制作图标

Python DBUS - 带有额外参数的接口(interface)上的 `PropertiesChanged` 监听器

c++ - 修改继承的成员变量不会影响基类

c++ - const 指针作为 std::bind 参数