boost::asio之Unix信号

来源:互联网 发布:mac如何截图网页 编辑:程序博客网 时间:2024/05/23 16:42

Unix信号是一种常用的进程间异步通信手段。asio库提供了类signal_set,利用异步IO的方式处理了Unix的信号。

signal_set的类摘要:

class signal_set{public:      explicit signal_set(io_service& io_service);      signal_set(io_service& io_service,int number,...);      void add(int signal_number);      void remove(int signal_number);      void clear();      void canael();      void async_wait(Signalhandler handler);//添加处理handler,非阻塞};
signal_set的构造函数必须传入io_service对象,用于提交异步操作。第二种构造还可以传入最多三个整数信号值,在构造时同时加入信号集。

signal_set的add()/remove()/clear()成员函数顾名思义容易理解,可以增加or删除信号量,同时也向io_service注册了信号事件。cancel()函数可以“取消”所有handler的操作,实际上是向boost::asio::error::operator_aborted错误,要求handler执行自己的cancel逻辑。

成员函数async_wait()用于异步添加信号处理函数,也就是handler,它是非阻塞的,无需任何等待就返回。handler的形式必须是:

void handler(const system::error_code& ec,//操作的错误码int signal_number);//引发操作的信号值

我们也可使用bind表达式把任意函数适配为handler的签名,从而在信号事件发生时被回调。

用法示例:

#include<iostream>#include<boost/function.hpp>#include<boost/asio.hpp>using namespace boost::asio;using namespace boost::system;int main(){io_service io;signal_set sig(io, SIGINT, SIGNSR1);    //Windows下面用SIGTERM代替SIGNSR1。/*signal_set sig(io);sig.add(SIGINT);sig.add(SIGUSR1);*///等价auto handler1 = [](const error_code& ec,int n) //定义第一个handler,使用lambda{if (ec){std::cout << ec.message() << std::endl;return;}if (n != SIGINT)return;std::cout << "handler recv=" << n << std::endl;std::cout << "do things" << std::endl;};typedef void(handler_type)(const error_code&, int);function<handler_type> handler2 = [ ](const error_code& ec, int n){if (n != SIGUSR1)//检查信号是否要处理{return;}std::cout << "handler2 recv=" << n << std::endl;};sig.async_wait(handler1); //异步添加处理handlersig.async_wait(handler2);io.run();//启动事件循环,阻塞等待信号事件std::cout << "io stoped" << std::endl;return 0;}





0 0
原创粉丝点击