其基本流程是:

1. 先构造一张有关文件描述符的表(集合、数组);

2. 将你关心的文件描述符加入到这个表中;

3. 然后调用一个函数。 select / poll

4. 当这些文件描述符中的一个或多个已准备好进行I/O操作的时候

该函数才返回(阻塞)。

5. 判断是哪一个或哪些文件描述符产生了事件(IO操作);

6. 做对应的逻辑处理;

注意:

****select函数返回之后,会自动将除了产生事件的文件描述符以外的位全部清空;

这样当你想下一次监听其它的事件的话,都被清空了,就监听不到了,所以写代码的时候,要定义一个临时的集合,所以在调用select之前要把原有的readfds付给临时tempfds。

任务:

我想检测是键盘事件(标准输入 文件描述如为0 ),

还是鼠标事件(文件描述符是/dev/input/mouse1);

【4】select

/* According to POSIX.1-2001 */

#include

/* According to earlier standards */

#include

#include

#include

int select(int nfds, fd_set *readfds, fd_set *writefds,

fd_set *exceptfds, struct timeval *timeout);

功能:select用于监测是哪个或哪些文件描述符产生事件;

参数:

nfds:    监测的最大文件描述个数

(这里是个数,使用的时候注意,与文件中最后一次打开的文件

描述符所对应的值的关系是什么?)

readfds:  读事件集合; //读(用的多)

writefds: 写事件集合;  //NULL表示不关心

exceptfds:异常事件集合;

timeout: 超时检测 1

如果不做超时检测:传 NULL

select返回值:

>0 表示有事件产生;

如果设置了超时检测时间:&tv

select返回值:

>0 表示有事件产生;

==0 表示超时时间已到;

struct timeval {

long    tv_sec;         /* seconds */

long    tv_usec;        /* microseconds */

};

void FD_CLR(int fd, fd_set *set);  //将set集合中的fd清除掉

int  FD_ISSET(int fd, fd_set *set); //判断fd是否存在于set集合中

void FD_SET(int fd, fd_set *set); //将fd加入到集合中

void FD_ZERO(fd_set *set);   //清空集合

任务1:

在TCP服务器代码中,实现并发,服务器可以响应多个客户端的连接请求;

服务器端的代码要关心sockfd

任务2:

在TCP服务器代码中,实现并发,服务器可以响应多个客户端的连接请求;

同时也能响应键盘输入;

服务器端的代码要关心2个文件描述符, 0  sockfd  鼠标

任务3:

服务器端监听: 0  sockfd  acceptfd

可以实现服务器端相应多个客户端的登录 和数据接收;

注意:

首先先监听0和sockfd,

当有客户端连接之后,accept函数返回,产生acceptfd

1. 需要将acceptfd加入到集合当中;

2. 需要更新maxfd

3. 当某一个客户端退出之后,这个客户端的acceptfd就失效了,

需要关闭这个acceptfd;清空这个集合对应位(置0)

超时检测

Select特点:

1. 一个进程最多只能监听1024个文件描述符 (千级别)

2. select被唤醒之后需要重新轮询一遍驱动的poll函数,效率比较低(消耗CPU资源);

3. select每次会清空表,每次都需要拷贝用户空间的表到内核空间,效率低(一个进程0~4G,0~3G是用户态,3G~4G是内核态,拷贝是非常耗时的);

select函数是怎么用的相关推荐

  1. R语言dplyr包使用select函数通过索引查询或者排除数据列实战(Select Columns by Index)

    R语言dplyr包使用select函数通过索引查询或者排除数据列实战(Select Columns by Index) 目录

  2. socket通信时如何判断当前连接是否断开--select函数,心跳线程,QsocketNotifier监控socket...

    client与server建立socket连接之后,如果突然关闭server,此时,如果不在客户端close(socket_fd),会有不好的影响: QsocketNotifier监控socket的槽 ...

  3. 关于select函数

    1.阻塞模式下必须开多线程来解决阻塞问题,但是为每个socket开了多线程后,多线程的运行开销很大,速度超级慢. 如果,多线程的速度能跟得上,那是非常不错.但是事实上可能并非如此. 2.因此selec ...

  4. UNIX中的Select函数

    表头文件 #i nclude<sys/time.h> #i nclude<sys/types.h> #i nclude<unistd.h> 定义函数 int sel ...

  5. select()函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET(转)

    select函数用于在非阻塞中,当一个套接字或一组套接字有信号时通知你,系统提供select函数来实现多路复用输入/输出模型, 原型: int select(int maxfd,fd_set *rds ...

  6. form select multiple 某个字段是数组_你知道什么是Select函数吗?

    Select函数:允许进程指示内核等待多个事件中的任何一个发生,并只在有一个或多个事件发生或经历一段指定的时间后才唤醒它. select man手册 举个栗子,我们可以调用Select,告诉内核仅仅在 ...

  7. linux 下 select 函数的用法

    一.Select 函数详细介绍 Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如connect. accept.recv ...

  8. SOCKET编程中,select()函数的作用

    SOCKET编程中,select()函数的作用Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如connect.accep ...

  9. 多路 IO 转接 :select 函数

    (1)头文件: #include <sys/select.h> (2)函数原型: int select( int nfds, fd_set *readfds, fd_set *writef ...

  10. step5 . day6 网络编程 基于TCP协议的多并发模式(使用多进程、多线程、select函数分别实现)...

    实现TCP服务器端多路并发的方法有①多进程②多线程③IO多路复用(select poll epoll函数) 1.多进程实现并发模式(仅在服务器端更改之前代码实现) 服务器端 #include < ...

最新文章

  1. java数据和窗口怎么结合_卖jsp编程技巧的那个垃圾的所有实例的答案全部
  2. C++ 中 inline 用法概述
  3. 实变函数与泛函分析导论
  4. Python sort()和sorted()
  5. 秒杀系统的架构解决之道
  6. 数据结构与算法书籍推荐
  7. Boost::context模块callcc的分段的测试程序
  8. 这样的递归调用,你看出来了?
  9. 360浏览器打不开qq空间_360浏览器打不开? 60浏览器打不开网页的处理方法(图文)...
  10. linux内核串口调试,linux 串口调试方法
  11. 正则化与数据先验分布的关系
  12. 181022词霸有道扇贝每日一句
  13. 韦东山freeRTOS系列教程之【第一章】FreeRTOS概述与体验
  14. PAT练习 人口普查
  15. GIS-坐标系-EPSG(二次整理)
  16. Contest3115 - 2021级新生个人训练赛第23场_10247 Problem C 爱好数学的国王
  17. 研发工程师-编程题(python)
  18. excel删除无尽空白行_批量删除空白行其实很简单,这3中方法都能快速搞定,简单易学...
  19. dfs——xy省赛选拔题——问题 E: 整数凑和问题
  20. Python四种读取数据文件的方法

热门文章

  1. 雷锋微视点:腾讯电商、搜搜、微信将出门独立
  2. 高数学习日记——矢量场与数量场的概念
  3. 使用python批量修改txt文件中的信息
  4. c语言中rewind函数_C语言中的rewind()函数与示例
  5. 针对车载系统相关的功能分析(车载OS、芯片、导航、DC、总线系统等)
  6. 数据结构算法之数组篇
  7. 高通滤波与低通滤波的简单理解
  8. 透过细节看日本(转)
  9. 错误: 找不到符号 符号: 类 DaggerActivityComponent错误解决
  10. 百度运维部—趣味运动会