select函数是怎么用的
其基本流程是:
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函数是怎么用的相关推荐
- R语言dplyr包使用select函数通过索引查询或者排除数据列实战(Select Columns by Index)
R语言dplyr包使用select函数通过索引查询或者排除数据列实战(Select Columns by Index) 目录
- socket通信时如何判断当前连接是否断开--select函数,心跳线程,QsocketNotifier监控socket...
client与server建立socket连接之后,如果突然关闭server,此时,如果不在客户端close(socket_fd),会有不好的影响: QsocketNotifier监控socket的槽 ...
- 关于select函数
1.阻塞模式下必须开多线程来解决阻塞问题,但是为每个socket开了多线程后,多线程的运行开销很大,速度超级慢. 如果,多线程的速度能跟得上,那是非常不错.但是事实上可能并非如此. 2.因此selec ...
- UNIX中的Select函数
表头文件 #i nclude<sys/time.h> #i nclude<sys/types.h> #i nclude<unistd.h> 定义函数 int sel ...
- select()函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET(转)
select函数用于在非阻塞中,当一个套接字或一组套接字有信号时通知你,系统提供select函数来实现多路复用输入/输出模型, 原型: int select(int maxfd,fd_set *rds ...
- form select multiple 某个字段是数组_你知道什么是Select函数吗?
Select函数:允许进程指示内核等待多个事件中的任何一个发生,并只在有一个或多个事件发生或经历一段指定的时间后才唤醒它. select man手册 举个栗子,我们可以调用Select,告诉内核仅仅在 ...
- linux 下 select 函数的用法
一.Select 函数详细介绍 Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如connect. accept.recv ...
- SOCKET编程中,select()函数的作用
SOCKET编程中,select()函数的作用Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如connect.accep ...
- 多路 IO 转接 :select 函数
(1)头文件: #include <sys/select.h> (2)函数原型: int select( int nfds, fd_set *readfds, fd_set *writef ...
- step5 . day6 网络编程 基于TCP协议的多并发模式(使用多进程、多线程、select函数分别实现)...
实现TCP服务器端多路并发的方法有①多进程②多线程③IO多路复用(select poll epoll函数) 1.多进程实现并发模式(仅在服务器端更改之前代码实现) 服务器端 #include < ...
最新文章
- java数据和窗口怎么结合_卖jsp编程技巧的那个垃圾的所有实例的答案全部
- C++ 中 inline 用法概述
- 实变函数与泛函分析导论
- Python sort()和sorted()
- 秒杀系统的架构解决之道
- 数据结构与算法书籍推荐
- Boost::context模块callcc的分段的测试程序
- 这样的递归调用,你看出来了?
- 360浏览器打不开qq空间_360浏览器打不开? 60浏览器打不开网页的处理方法(图文)...
- linux内核串口调试,linux 串口调试方法
- 正则化与数据先验分布的关系
- 181022词霸有道扇贝每日一句
- 韦东山freeRTOS系列教程之【第一章】FreeRTOS概述与体验
- PAT练习 人口普查
- GIS-坐标系-EPSG(二次整理)
- Contest3115 - 2021级新生个人训练赛第23场_10247 Problem C 爱好数学的国王
- 研发工程师-编程题(python)
- excel删除无尽空白行_批量删除空白行其实很简单,这3中方法都能快速搞定,简单易学...
- dfs——xy省赛选拔题——问题 E: 整数凑和问题
- Python四种读取数据文件的方法