UNIX SIGIO信号的使用
来源:互联网 发布:机器视觉算法原理 编辑:程序博客网 时间:2024/05/24 04:04
windows平台下异步IO可以通过WSAEventSelcet来实现IO读写操作的异步通知,UNIX下也有一个类型的SIGIO信号来实现IO异步通知机制。为了验证该功能,自己做了一个 demo,发帖保存一下。
1.首先初始化一个socket(当然也可以用其它的文件描述符);将这个文件描述符设置成异步非阻塞;初始化一个SIGIO信号的处理函数
struct sockaddr_in serv_addr1;s_sockListen = socket(AF_INET,SOCK_STREAM,0);serv_addr1.sin_family = AF_INET;serv_addr1.sin_port = htons(5999);serv_addr1.sin_addr.s_addr = INADDR_ANY;//捆绑SIGIO信号的处理struct sigaction sigio_action;memset(&sigio_action, 0, sizeof(sigio_action));sigio_action.sa_flags = 0;sigio_action.sa_handler = do_sigio;sigaction(SIGIO, &sigio_action, NULL);//将文件描述符和本进程进行 捆绑 fcntl(s_sockListen,F_SETOWN,getpid());int nIOflag = fcntl(s_sockListen,F_GETFL,0);nIOflag = nIOflag|O_ASYNC|O_NONBLOCK;//设置s_sockListen为异步非阻塞 fcntl(s_sockListen,F_SETFL,nIOflag);if(bind(s_sockListen, (struct sockaddr *) &serv_addr1, sizeof(serv_addr1))<0)THROW_EXCEPTION(LISTEN_SOCK_FAILE,errno,strerror(errno));if(listen(s_sockListen, 0)<0)THROW_EXCEPTION(BIND_SOCK_FAILE,errno,strerror(errno));
2.定义信号处理函数
void do_sigio(int sig) { int sockClient = -1; socklen_t nCliSockLen; struct sockaddr_in cli_addr; char strPipeBuff[100]={0}; try { sockClient = accept(s_sockListen, (struct sockaddr *) &cli_addr, &nCliSockLen); if (sockClient==-1) THROW_EXCEPTION(ACCT_SOCK_FAILE,errno,strerror(errno)); int n = read(sockClient,strPipeBuff,sizeof(strPipeBuff)); if(n==-1) THROW_EXCEPTION(RECV_SOCK_FAILE,errno,strerror(errno)); close(sockClient); 数据处理............} catch(WAMException &ex) { return; } }
总结:windows平台下的WSAEventselect模型可以精确定位到,读写,连接,断开等事件,Unix平台下除了epoll似乎没有这样事件定义。
- UNIX SIGIO信号的使用
- UNIX SIGIO信号的使用http://blog.csdn.net/msda/article/details/8090748
- 信号驱动(SIGIO)的异步I/O
- 信号驱动(SIGIO)的异步I/O
- 信号驱动(SIGIO)的异步I/O
- SIGIO
- 有趣的UNIX信号
- UNIX的信号
- Unix常见的信号以及信号定义
- UNIX下的信号问题
- UNIX下的信号问题
- unix产生信号的事件
- UNIX信号的阻塞概念
- unix编程专题-信号机制使用实例
- 【Unix】信号
- Unix 信号
- unix 信号
- Unix信号详解(Signal的信号说明)
- 新安装 Ubuntu 12.10 需要做的 10 件事
- android 布局中的单位及分辨率自解
- Win8触控时代来了,该跟Windows XP说再见了
- Ubuntu 12.10打破PC与网络藩篱 整合云端应用
- 长度为1的线段,随机在其上选择两点,将线段分为三段,问这3个字段能组成一 个三角形的概率是多少
- UNIX SIGIO信号的使用
- 以用户为中心的web设计 笔记
- 原谅你,是换来你放肆的资本:伤感日志
- 苹果在英国上诉失败,必须公开向三星公司道歉
- 天堂里的苹果!乔布斯去世一周年纪念
- 创建支持HTTPS的DefaultHttpClient
- 开发相关文章转载地址(陆续更新)
- mysql数据库密码设置注意事项
- 卡巴斯基实验室规划新操作系统