Linux IO多路复用 select

之前曾经写过简单的服务器,服务器是用多线程阻塞,客户端每一帧是用非阻塞实现的

后来发现select可以用来多路IO复用,就是说可以把服务器这么多线程放在一个线程里面,减小资源消耗,没必要开多个线程

不过实际上select使用很少,现在一般会用epoll这个函数

我们先来看一下linux里面man手册对select的介绍

可见select是个同步的io

DESCRIPTION

select() and pselect() allow a program to monitor multiple file

descriptors, waiting until one or more of the file descriptors become

"ready" for some class of I/O operation (e.g., input possible). A file

descriptor is considered ready if it is possible to perform a corre‐

sponding I/O operation (e.g., read(2) without blocking, or a suffi‐

ciently small write(2)).

翻译过来大概的意思就是这个函数可以监视已经准备好的文件描述符,然后对他们进行读写

再来看一下函数原型

 int select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);

第一个参数是监听最大文件描述符 (一般是maxfd+1,从0开始算)

接下来三个分别是读,写,异常的fd_set

fd_set是文件描述符集合

最后一个是超时时间设NULL为无限等待

当然,我们一般是用宏定义来操作fdset FD_ZERO FD_CLR FD_SET FD_IISET

void FD_CLR(int fd, fd_set *set);//清除一个文件描述符
int FD_ISSET(int fd, fd_set *set);//测试一个文件描述符
void FD_SET(int fd, fd_set *set);//添加一个
void FD_ZERO(fd_set *set);//全都设为 0
//不要被手册迷惑,这个是宏定义,使用的时候要注意

这个其实就是用数组实现的

32位系统: /usr/include/i386-linux-gnu/sys
64位系统: /usr/include/x86_64-linux-gnu/sys/

具体使用:

    fd_set rfds;
struct timeval tv;
int retval; /* Watch stdin (fd 0) to see when it has input. */
FD_ZERO(&rfds);
FD_SET(0, &rfds); /* Wait up to five seconds. */
tv.tv_sec = 5;
tv.tv_usec = 0; retval = select(1, &rfds, NULL, NULL, &tv);
/* Don't rely on the value of tv now! */ if (retval == -1)
perror("select()");
else if (retval)
printf("Data is available now.\n");
/* FD_ISSET(0, &rfds) will be true. */
else
printf("No data within five seconds.\n");

缺点:

  1. 有上限 linux 1024 (fd_set 是数组实现的,肯定有上限)
  2. 每次监听的时候涉及到数组copy到内核,监听较多文件描述符时候可能会性能下降
  3. 内核完成的时候也会涉及到copy
  4. select只能返回有几个文件描述符就绪,而不会告诉你具体是哪一个,需要遍历

自己做做demo的时候还是挺好用的

这里有两个实例,我觉得很容易看懂

https://blog.csdn.net/fengel_cs/article/details/78645140

https://www.cnblogs.com/luoxn28/p/6220372.html

同步异步不过不太清除的可以具体看看这个文章,写的很好

https://www.cnblogs.com/euphie/p/6376508.html

Linux IO多路复用 select的更多相关文章

  1. Linux IO多路复用 select/poll/epoll

    Select -- synchronius I/O multiplexing select, FS_SET,FD_CLR,FD_ISSET,FD_ZERO #include <sys/time. ...

  2. 【知乎网】Linux IO 多路复用 是什么意思?

    提问一: Linux IO多路复用有 epoll, poll, select,知道epoll性能比其他几者要好.也在网上查了一下这几者的区别,表示没有弄明白. IO多路复用是什么意思,在实际的应用中是 ...

  3. Linux IO多路复用 poll

    Linux IO多路复用 poll 之前曾经提到过 select poll 跟select类似,poll改进了select的一个确定,就是poll没有监听上限 不过poll还是需要遍历以及频繁的把数组 ...

  4. io多路复用-select()

    参照<Unix网络编程>相关章节内容,实现了一个简单的单线程IO多路复用服务器与客户端. 普通迭代服务器,由于执行recvfrom则会发生阻塞,直到客户端发送数据并正确接收后才能够返回,一 ...

  5. Linux IO多路复用

    监听文件描述符的状态来进行相应的读写操作,3个函数: 123 selectpollepoll 123456789 int (int nfds, fd_set *readfds, fd_set *wri ...

  6. 第五十五节,IO多路复用select模块加socket模块,伪多线并发

    IO多路复用select模块加socket模块,伪多线并发,并不是真正的多线程并发,实际通过循环等待还是一个一个处理的 IO多路复用,lo就是文件或数据的输入输出,IO多路复用就是可以多用户操作 IO ...

  7. 转一贴,今天实在写累了,也看累了--【Python异步非阻塞IO多路复用Select/Poll/Epoll使用】

    下面这篇,原理理解了, 再结合 这一周来的心得体会,整个框架就差不多了... http://www.haiyun.me/archives/1056.html 有许多封装好的异步非阻塞IO多路复用框架, ...

  8. Python实战之IO多路复用select的详细简单练习

    IO多路复用 I/O多路复用指:通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作. select   它通过一个select()系统调用来 ...

  9. I/O模型系列之五:IO多路复用 select、poll、epoll

    IO多路复用之select.poll.epoll IO多路复用:通过一种机制,一个进程可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作. 应用:适用于针 ...

随机推荐

  1. js的一道经典题目

    今天碰到一道题,里面既包含了匿名函数的知识,也包含了预编译,函数的传参(形参),感觉迷迷糊糊的,所以想着做个总结. var foo={n:1}; (function(foo){ console.log ...

  2. 小J学python--Exception-异常

    现在我们要打开一个名为fuck的文件,fuck是不存在的,看看异常是怎么工作的 不捕获异常的情况 #打开文件 open('fuck') 执行结果 捕获所有异常 Exception是所有异常类的父类,所 ...

  3. Mysql进阶-day3

    多实例介绍: mysql多实例就是一台服务器开启多个不同的服务端口(3306,3307),运行多个MySQL服务进程,这些服务进程通过不同的socket监听不同的服务端口来提供各自的服务端口. 这些m ...

  4. Linux和Unix的区别

    Linux      Unix 免费        收费 开源        不开源 硬件无要求   有要求 IBM Sun Hp 主流的Linux的发型版本: RedHat Fedora  Mand ...

  5. BZOJ1499:[NOI2005]瑰丽华尔兹(DP,单调队列)

    Description 你跳过华尔兹吗?当音乐响起,当你随着旋律滑动舞步,是不是有一种漫步仙境的惬意?众所周知,跳华尔兹时,最重要的是有好的音乐.但是很少有几个人知道,世界上最伟大的钢琴家一生都漂泊在 ...

  6. P1081 开车旅行

    题目描述 小 A 和小 B 决定利用假期外出旅行,他们将想去的城市从 1 到 N 编号,且编号较小的 城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i 的海拔高度为 Hi,城市 ...

  7. spring boot实战(第二篇)事件监听

    http://blog.csdn.net/liaokailin/article/details/48186331 前言 spring boot在启动过程中增加事件监听机制,为用户功能拓展提供极大的便利 ...

  8. 从零搭建vue

    第一步: 安装node.js,一般安装 长期维护版  相对比较稳定 点击下载,下载好了之后双击运行,可选择安装路径,然后一路下一步即可. 安装完成后,在cmd输入 node -v 如果出现版本号,则安 ...

  9. linux挂在新硬盘

    login as: rootroot@192.168.109.128's password:Last login: Fri Mar 22 14:12:08 2019 from 192.168.109. ...

  10. Java中使用OpenSSL生成的RSA公私钥

    RSA是什么:RSA公钥加密算法是1977年由Ron Rivest.Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的.RSA取名来自开发他们三者的名字.RSA是目前最有影响力的 ...