信号(signal)是UNIX系统中的一种常用的进程间异步通信机制。asio提供了类signal_set,利用异步IO的方式处理UNIX信号
signal_set表示要处理的信号集合,类摘要如下:
- 构造函数:
- 要求必须传入io_server对象,用于提交异步操作
- 还可以最多传入3个整数信号值,在构造的时候同时加入信号集
- add、remove、clear:添加/删除信号量,同时向io_service注册信号事件
- cancel:
- 功能:“取消”所有handler操作
- 原理:向所有handler传入boost::asio::error::operation_aborted错误,要求handler执行自己的cancel逻辑
- asyn_wait()
- 功能:
- 异步添加信号处理函数handler
- 是非阻塞的,无需等待即返回
- 注意:
+ handler的形式必须是如下
+ 但是我们可以使用bind或者lambda表达式把任意函数适配为handler的签名
- 功能:
使用
步骤
- 声明io_service对象,只有这样才能把信号处理加入事件处理循环异步等待信号的发生
- 构造signal_set
- 用async_wait()添加信号对应的处理函数
- 最后调用io_service对象的run()方法,启动事件循环等待信号
实例
#include <iostream>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/thread.hpp>
using namespace boost;
void signal_handler(const boost::system::error_code& err, int signal)
{
switch (signal) {
case SIGINT:
std::cout << "SIGNINT" << std::endl;
break;
case SIGTERM:
std::cout << "SIGNTERM" << std::endl;
break;
default:
break;
}
}
int main(int argc, const char * argv[]) {
asio::io_service service;
asio::signal_set sigset(service, SIGINT, SIGTERM);
sigset.async_wait(signal_handler);
boost::system::error_code ec;
service.run(ec);
if(ec)
{
std::cout << boost::system::system_error(ec).what() << std::endl;
}
std::cout << "End" << std::endl;
}