尝鲜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多路复用相关推荐

  1. 基于 Blazui 的 Blazor 后台管理模板 BlazAdmin 正式尝鲜

    简介 BlazAdmin 是一个基于Blazui的后台管理模板,无JS,无TS,非 Silverlight,非 WebForm,一个标签即可使用. 我将在下一篇文章讨论 Blazor 服务器端渲染与客 ...

  2. 【翻译】五步快速使用LINQPad尝鲜StreamInsight

    原文链接:http://seroter.wordpress.com/2010/12/23/5-quick-steps-for-trying-out-streaminsight-with-linqpad ...

  3. hexo(sakura)给博客增添侧边栏(回到顶部,跳转评论,深色模式,播放音乐)Valine-1.4.4新版本尝鲜+个性制定(表情包、qq头像、UI样式)

    文章目录 hexo(sakura)给博客增添侧边栏(回到顶部,跳转评论,深色模式,播放音乐) 原理 直接使用 Valine-1.4.4新版本尝鲜+个性制定(表情包.qq头像.UI样式) 总结 本文全是 ...

  4. 通用流量录制回放工具 jvm-sandbox-repeater 尝鲜 (二)——repeater-console 使用

    本文作者陈恒捷是TesterHome社区主编,第十届MTSC大会上海站-开源专场出品人.先后在PP助手.PPmoney.荔枝等公司从事测试效能提升相关工作,在测试技术及效率提升方面有丰富的经验积累. ...

  5. 通用流量录制回放工具 jvm-sandbox-repeater 尝鲜 (三)—— repeater plugin 开发

    本文作者陈恒捷是TesterHome社区主编,第十届MTSC大会上海站-开源专场出品人.先后在PP助手.PPmoney.荔枝等公司从事测试效能提升相关工作,在测试技术及效率提升方面有丰富的经验积累. ...

  6. oracle 12c r2下载地址,Oracle 12C R2安装尝鲜

    Oracle 12C R2下载安装尝鲜 1 下载 目前Oracle以提供官方的Edelivery站点,以提供两个版本的12.2的下载.是linux和solaris.https://www.cndba. ...

  7. galaxy android 8,三星终于正式升级安卓8.0!Galaxy S8尝鲜

    原标题:三星终于正式升级安卓8.0!Galaxy S8尝鲜 经过长时间的测试,在友商陆续吃上奥利奥之后,三星终于开始向Galaxy S8/S8+正式推送安卓8.0,也带来了新的Experience U ...

  8. 鸿蒙系统开发者公测,公测尝鲜开启!华为Mate40/P40开始和安卓渐行渐远

    目前华为官方发布公告,华为EMUI的微博等相关官方媒体账号全部更名为HarmonyOS,这也意味着HarmonyOS将会成为华为在软件系统层面的重心,彻底替代基于Android的华为EMUI. 至于那 ...

  9. 华为鸿蒙去哪里更新,华为鸿蒙OS正式尝鲜版名单更新,升级?还是不升级?

    原标题:华为鸿蒙OS正式尝鲜版名单更新,升级?还是不升级? 请点击[关注],获取更多数码资讯 华为鸿蒙系统正式版本已经开始推送,公测尝鲜版与正式尝鲜版机型名单已经更新:"Mate40系列.M ...

最新文章

  1. linux/nginx 安全增强
  2. Android 9.0 内核编译实战(以一加6为例)
  3. 剑指offer之16-20题解
  4. 文档中快速输入日期时间的方法
  5. 【PL/SQL】学习笔记 (10)例外之 too_many_rows
  6. 油猴安装使用[自留]
  7. 随机森林 ---sklearn
  8. java bridge_JavaBridge
  9. 一个好用的软件定时器模块MultiTimer
  10. LeetCode 1528. 重新排列字符串
  11. 计算机什么是符号健,键盘数字健1-8的标点符号的名称什么
  12. 用html写箭头的原理,5个编写高质量箭头函数的最佳实践
  13. hbase数据库_hbase 什么类型的数据库
  14. TemplatesImpl利用链与Fastjson注入内存马
  15. 如果不懂这些搜索技巧,就别说你懂 GitHub
  16. Android开发常用代码
  17. steam 好友网络无法访问解决方法
  18. 什么是数据指标管理,如何建立指标管理体系
  19. 深入浅出谈人脸识别技术
  20. STK 与Matlab 的连接

热门文章

  1. 卢梭《社会契约论》之论原始社会
  2. Photoshop去除海报上的文字
  3. 15kw充电桩模块设计,源代码,原理图
  4. 解决bootstrap轮播图因为图片尺寸造成的问题
  5. 详解Java虚拟机栈
  6. 二进制数转化为十进制数(栈的学习练习)
  7. 云创大数据1+X大数据应用部署与调优职业技能等级证书预申报正式开启!
  8. android 播放英强博客,Android内存管理、监测剖析
  9. 隐形矫正计算机软件,隐形矫治器治疗流程和原理
  10. Juniper IP monitor(RPM)