尝鲜select多路复用
尝鲜select多路复用
问题:
如何增强服务端能力,同时支持多个客户端?
Linux的设计哲学
一切皆文件
- Linux中的文件是什么?
- 狭义:
- 文件系统中物理意义上的文件(逻辑上关联的数据集合)
- 广义
- 设备,管道,内存…
- Linux管理的一切对象
- 狭义:
- 理解文件描述符(File Descriptor)
- 文件描述符是一个非负整数值,本质上一个句柄
- 一切对用户(程序员)透明的资源标识都可以看做句柄
- 用户使用文件描述符(句柄)与内核交互
- 内核通过文件描述符操作对应资源的数据结构
- 一切皆文件的意义
- 统一各种设备的操作方式(open,read,write,close)
- 如:
- IO设备(命令行,显示器)
- 网络设备(网卡)
- …
Linux文件操作编程模式
- 编程实验——以文件类型操作命令行
#include <stdio.h>
#include <unistd.h>int main(void)
{int iofd = 0;int len = 0;char str[] = "Titai,soft\n";write(iofd, str, sizeof(str));len = read(0, str, 5);str[len] = '\0';printf("%s\n",str);return 0;
}
事件相关函数的分类
- 阻塞式函数
- 函数调用后需要等待某个事件发生后才会返回
- 非阻塞式函数
- 函数调用后能够及时返回(仅标记等待的事件)
- 事件发生后以回调方式传递
- 阻塞vs轮询
- 轮询指依序询问每一个相关设备是否需要服务的方式
- 轮询可用于解决函数导致程序无法继续执行的问题
神奇的selec()函数
- select()用于监视指定的文件描述符是否产生事件
- 可通过轮询的方式检测目标事件(事件产生则标记发生变化)
- 根据事件类型做出具体处理(如:读取数据)
int select(int maxfd,fd_set* readset,fd_set* writeset,fd_set* exceotset,const struct timeval* timeout);
select()函数的使用步骤
select()相关数据类型及操作
fd0 | fd1 | fd2 | fd3 | … |
---|---|---|---|---|
0 | 1 | 1 | 0 | … |
FD_ZERO(fd_set* fdset);//将fd_set变量的所有位设置为0
FD_SET(int fd,fd_set* fdset);//在fd_set中指定需要监听的fd
FD_CLR(int fd, fd_set* fdset);//在fd_set中剔除fd,不再监听
FD_ISSET(int fd, fd_set* fdset);//在fd_set查看是否包含fd
代码示例
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <malloc.h>int main(void)
{char s[] = "hello world\n";fd_set reads = {0};fd_set tmps = {0};int iofd = 0;struct timeval timeout = {0};int r = -1;int len = 0;FD_ZERO(&reads);FD_SET(iofd, &reads);while( 1 ){tmps = reads;timeout.tv_sec = 0;timeout.tv_usec = 10*1000;r = select(1, &tmps, 0, 0, &timeout);if(r > 0){len = read(1, s, sizeof(s));s[len] = 0;printf("s[]:%s\n",s);}else if( r == 0){//so somethingstatic int count = 0;usleep(10 * 1000);count++;if(count > 100){printf("do something else\n");count = 0;}}else{break;}}return 0;
}
尝鲜select多路复用相关推荐
- 基于 Blazui 的 Blazor 后台管理模板 BlazAdmin 正式尝鲜
简介 BlazAdmin 是一个基于Blazui的后台管理模板,无JS,无TS,非 Silverlight,非 WebForm,一个标签即可使用. 我将在下一篇文章讨论 Blazor 服务器端渲染与客 ...
- 【翻译】五步快速使用LINQPad尝鲜StreamInsight
原文链接:http://seroter.wordpress.com/2010/12/23/5-quick-steps-for-trying-out-streaminsight-with-linqpad ...
- hexo(sakura)给博客增添侧边栏(回到顶部,跳转评论,深色模式,播放音乐)Valine-1.4.4新版本尝鲜+个性制定(表情包、qq头像、UI样式)
文章目录 hexo(sakura)给博客增添侧边栏(回到顶部,跳转评论,深色模式,播放音乐) 原理 直接使用 Valine-1.4.4新版本尝鲜+个性制定(表情包.qq头像.UI样式) 总结 本文全是 ...
- 通用流量录制回放工具 jvm-sandbox-repeater 尝鲜 (二)——repeater-console 使用
本文作者陈恒捷是TesterHome社区主编,第十届MTSC大会上海站-开源专场出品人.先后在PP助手.PPmoney.荔枝等公司从事测试效能提升相关工作,在测试技术及效率提升方面有丰富的经验积累. ...
- 通用流量录制回放工具 jvm-sandbox-repeater 尝鲜 (三)—— repeater plugin 开发
本文作者陈恒捷是TesterHome社区主编,第十届MTSC大会上海站-开源专场出品人.先后在PP助手.PPmoney.荔枝等公司从事测试效能提升相关工作,在测试技术及效率提升方面有丰富的经验积累. ...
- oracle 12c r2下载地址,Oracle 12C R2安装尝鲜
Oracle 12C R2下载安装尝鲜 1 下载 目前Oracle以提供官方的Edelivery站点,以提供两个版本的12.2的下载.是linux和solaris.https://www.cndba. ...
- galaxy android 8,三星终于正式升级安卓8.0!Galaxy S8尝鲜
原标题:三星终于正式升级安卓8.0!Galaxy S8尝鲜 经过长时间的测试,在友商陆续吃上奥利奥之后,三星终于开始向Galaxy S8/S8+正式推送安卓8.0,也带来了新的Experience U ...
- 鸿蒙系统开发者公测,公测尝鲜开启!华为Mate40/P40开始和安卓渐行渐远
目前华为官方发布公告,华为EMUI的微博等相关官方媒体账号全部更名为HarmonyOS,这也意味着HarmonyOS将会成为华为在软件系统层面的重心,彻底替代基于Android的华为EMUI. 至于那 ...
- 华为鸿蒙去哪里更新,华为鸿蒙OS正式尝鲜版名单更新,升级?还是不升级?
原标题:华为鸿蒙OS正式尝鲜版名单更新,升级?还是不升级? 请点击[关注],获取更多数码资讯 华为鸿蒙系统正式版本已经开始推送,公测尝鲜版与正式尝鲜版机型名单已经更新:"Mate40系列.M ...
最新文章
- linux/nginx 安全增强
- Android 9.0 内核编译实战(以一加6为例)
- 剑指offer之16-20题解
- 文档中快速输入日期时间的方法
- 【PL/SQL】学习笔记 (10)例外之 too_many_rows
- 油猴安装使用[自留]
- 随机森林 ---sklearn
- java bridge_JavaBridge
- 一个好用的软件定时器模块MultiTimer
- LeetCode 1528. 重新排列字符串
- 计算机什么是符号健,键盘数字健1-8的标点符号的名称什么
- 用html写箭头的原理,5个编写高质量箭头函数的最佳实践
- hbase数据库_hbase 什么类型的数据库
- TemplatesImpl利用链与Fastjson注入内存马
- 如果不懂这些搜索技巧,就别说你懂 GitHub
- Android开发常用代码
- steam 好友网络无法访问解决方法
- 什么是数据指标管理,如何建立指标管理体系
- 深入浅出谈人脸识别技术
- STK 与Matlab 的连接