UNIX SIGIO信号的使用http://blog.csdn.net/msda/article/details/8090748

 

UNIX SIGIO信号的使用

分类: Unix/Linux C   1938人阅读  评论(0)  收藏  举报

     windows平台下异步IO可以通过WSAEventSelcet来实现IO读写操作的异步通知,UNIX下也有一个类型的SIGIO信号来实现IO异步通知机制。为了验证该功能,自己做了一个 demo,发帖保存一下。

1.首先初始化一个socket(当然也可以用其它的文件描述符);将这个文件描述符设置成异步非阻塞;初始化一个SIGIO信号的处理函数

[cpp]  view plain copy
  1. struct sockaddr_in serv_addr1;  
  2.         s_sockListen = socket(AF_INET,SOCK_STREAM,0);  
  3.         serv_addr1.sin_family = AF_INET;  
  4.         serv_addr1.sin_port = htons(5999);  
  5.         serv_addr1.sin_addr.s_addr = INADDR_ANY;  
  6.         //捆绑SIGIO信号的处理  
  7.         struct sigaction sigio_action;  
  8.         memset(&sigio_action, 0, sizeof(sigio_action));  
  9.         sigio_action.sa_flags = 0;  
  10.         sigio_action.sa_handler = do_sigio;  
  11.         sigaction(SIGIO, &sigio_action, NULL);  
  12.   
  13.         //将文件描述符和本进程进行 捆绑   
  14.         fcntl(s_sockListen,F_SETOWN,getpid());  
  15.         int nIOflag = fcntl(s_sockListen,F_GETFL,0);  
  16.         nIOflag = nIOflag|O_ASYNC|O_NONBLOCK;  
  17.         //设置s_sockListen为异步非阻塞   
  18.         fcntl(s_sockListen,F_SETFL,nIOflag);  
  19.   
  20.         if(bind(s_sockListen, (struct sockaddr *) &serv_addr1, sizeof(serv_addr1))<0)  
  21.             THROW_EXCEPTION(LISTEN_SOCK_FAILE,errno,strerror(errno));  
  22.   
  23.         if(listen(s_sockListen, 0)<0)  
  24.             THROW_EXCEPTION(BIND_SOCK_FAILE,errno,strerror(errno));  


2.定义信号处理函数

[cpp]  view plain copy
  1. void do_sigio(int sig)  
  2. {  
  3.  int sockClient = -1;  
  4.  socklen_t nCliSockLen;  
  5.  struct sockaddr_in cli_addr;  
  6.  char strPipeBuff[100]={0};  
  7.  try  
  8.  {  
  9.      sockClient = accept(s_sockListen, (struct sockaddr *) &cli_addr, &nCliSockLen);  
  10.      if (sockClient==-1) THROW_EXCEPTION(ACCT_SOCK_FAILE,errno,strerror(errno));  
  11.   
  12.      int n = read(sockClient,strPipeBuff,sizeof(strPipeBuff));  
  13.      if(n==-1) THROW_EXCEPTION(RECV_SOCK_FAILE,errno,strerror(errno));  
  14.      close(sockClient);  
  15.      数据处理............  
  16. }  
  17.  catch(WAMException &ex)  
  18.  {  
  19.      return;  
  20.  }  
  21. }  


总结:windows平台下的WSAEventselect模型可以精确定位到,读写,连接,断开等事件,Unix平台下除了epoll似乎没有这样事件定义。

版权声明:本文为博主原创文章,未经博主允许不得转载。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值