signal_set
signal_set提供了一个信号,方便异步处理程序,比如设置了SIGINT信号,程序中断先连接一个函数,如果触发了中断这个信号就会触发这个函数。
基本用法
asio::io_service service;
asio::signal_set sigset(service);
m_signals.add(SIGINT); //添加信号,remove删除
sigset.async_wait(signal_handler); //设置触发函数
sigset.async_wait(boost::bind(&CClass::signal_handler, shared_from_this()));
sigset.cancel(); // 清空(删除)集合中的所有信号量,并删除所有通知队列里的事件,如果集合本身为空,则抛出错误。
sigset.clear(); //不改变集合中的信号量,向所有与信号有关的操作抛出错误码来终止其操作。
使用例子
#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;
}
sigset 可以设置的值有:
#define SIGINT 2 /* interrupt */
#define SIGILL 4 /* illegal instruction - invalid function image */
#define SIGFPE 8 /* floating point exception */
#define SIGSEGV 11 /* segment violation */
#define SIGTERM 15 /* Software termination signal from kill */
#define SIGBREAK 21 /* Ctrl-Break sequence */
#define SIGABRT 22 /* abnormal termination triggered by abort call */