c++ - 如何在 C++ 中使用 std::bind 函数作为信号处理程序?
问题描述
我正在使用以下代码向我的 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)’}
有没有办法将绑定函数与signal
C++ 中的函数结合使用?
解决方案
的结果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
是全局变量(命名空间范围变量),因此不需要捕获。非捕获 lambda 可以隐式转换为相应的函数指针类型。
推荐阅读
- javascript - 回调值返回未定义
- sql - 在 SQL 存储过程中将 datetime 转换为 varchar
- r - 使用 awk、sed 或 R 基于字符串模式对所有行条目进行复杂提取
- android - 如何在 MaterialButton 中的文本右侧添加可绘制对象?
- javascript - 使用 Google API 获取两个位置之间的距离。PHP
- google-chrome - 带有 Bootstrap 的 Chrome 中未显示字体真棒图标
- c# - 如何使用 textboxfor 和 validationmessagefor 显示客户端验证正确
- r - 从powershell运行Rscript时找不到.Renviron变量?
- c++ - 为什么 Bazel 找不到 Visual C++ 构建工具?
- awk - awk 数据透视表并在重复列中使用标题行