fd_set

select()函数

北城余情 提交于 2019-12-01 04:53:07
原型: #include<sys/time.h> #include<unistd.h> int select(int maxfd, fd_set *rdset, fd_set *wrest, fd_set *exset, struct timeval *timeout); 参数: maxfd:描述需要监视最大文件描述符+1 rdset:监视的可读文件描述符的集合 wrset:监视的可写文件描述符的集合 exset:监视的异常文件描述符的集合 struct timeval:描述一段时间长度,如果在这个时间内,需要监视的描述符没有事件发生,返回0 返回值: 超时返回0 失败返回-1 成功返回大于0的整数,这个整数表示就绪描述符的数目 int FD_ZERO(fd_set *fdset):将指定的文件描述符集情况,在对文件描述符集合进行设置之前,必须对其进行初始化。如果不请空,由于在系统分配内存后,通常不做清空处理,所以结果时不可知的。 int FD_SET(int fd, fd_set *fdset); 用于在文件描述符集合中添加一个新的文件描述符 int FD_CLR(int fd, fd_set *fdset); 用于在文件描述符集合中删除一个新的文件描述符 int FD_ISSET(int fd, fd_set *fdset); 用于测试指定的文件描述符是否在该集合中。 注意

嵌入式linux4412多路复用式串口操作(select和poll实现方法)

时光总嘲笑我的痴心妄想 提交于 2019-11-28 22:47:44
1实验目的 通过编写多路复用式串口读写,进一步理解多路复用函数的用法,同时更加熟练地掌握LINUX设备文件的读写方法。 2、实验内容 本实验中,实现两台机器(宿主机和目标板)之间的串口通信,而且每台机器均可以发送数据和接收数据。除了串口的设备名称不同,两台机器上的程序基本相同。 首先,程序打开串口设备文件并进行相关配置,调用select()函数或poll()函数,使它等待从标准输入(终端)文件中的输入数据及串口设备的输入数据。 1、如果有标准输入文件上的数据,则写入到串口,使对方读取。 2、如果有串口设备上的输入数据,则将数据写入到普通文件中。 select函数 LINUX系统提供select函数来实现 多路复用输入/输出模型 ,原型: int select(int maxfd,fd_set *rdset,fd_set *wrset,fd_set *exset,struct timeval *timeout); 参数maxfd是需要监视的最大的文件描述符值+1;rdset,wrset,exset分别对应于需要检测的 可读文件描述符 的集合, 可写文件描述符 的集 合及 异常文件描述符 的集合。struct timeval结构用于描述一段时间长度,如果在这个时间内,需要监视的描述符没有事件发生则函数返回,返回值为0。 1.timeout=NULL( 阻塞 :select将一直被阻塞

服务器之select

守給你的承諾、 提交于 2019-11-28 13:45:34
select select能监听的文件描述符个数受限于FD_SETSIZE,一般为1024,单纯改变进程打开的文件描述符个数并不能改变select监听文件个数 解决1024以下客户端时使用select是很合适的,但如果链接客户端过多,select采用的是轮询模型,会大大降低服务器响应效率,不应在select上投入更多精 #include <sys/select.h> /* According to earlier standards */ #include <sys/time.h> #include <sys/types.h> #include <unistd.h> int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); nfds: 监控的文件描述符集里最大文件描述符加1,因为此参数会告诉内核检测前多少个文件描述符的状态 readfds: 监控有读数据到达文件描述符集合,传入传出参数 writefds: 监控写数据到达文件描述符集合,传入传出参数 exceptfds: 监控异常发生达文件描述符集合,如带外数据到达异常,传入传出参数 timeout: 定时阻塞监控时间,3种情况 1.NULL,永远等下去 2.设置timeval,等待固定时间

Linux之多路I/O复用

亡梦爱人 提交于 2019-11-28 01:35:18
一、select int select(int maxfdp1, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *tvptr); //成功则返回已准备好的文件描述符个数,超时则返回0,出错则返回-1 int FD_ZERO(fd_set *fdset); int FD_SET(int fd, fd_set *fdset); int FD_CLR(int fd, fd_set *fdset); int FD_ISSET(int fd, fd_set *fdset); 1 #include <sys/select.h> 2 #include <unistd.h> 3 4 int main(int argc, char *argv[]) 5 { 6 fd_set readset, writeset; 7 int ret = 0; 8 FD_ZERO(&readset); 9 FD_ZERO(&writeset); 10 FD_SET(3, &readset); 11 FD_SET(5, &writeset); 12 13 ret = select(6, &readset, &writeset, NULL, NULL); 14 switch (ret) 15 { 16 case -1: /

I/O多路转接模型

那年仲夏 提交于 2019-11-28 00:47:17
IO多路转接模型大致分为三种:select模型/poll模型/epoll模型。 IO多路转接模型的功能:可以实现对大量描述符信息进行就绪事件监控,可以让进程针对就绪描述符进行操作; 可以让进程/线程避免因为对非就绪的描述符进行操作而阻塞。 可以让一个进程轮询对大量的就绪描述符进行操作,从而实现服务器与客户端这种一对多的通信。 IO多路转接模型也是一种高并发的模型。 int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout); 参数解释:nfds是需要监视的最大的文件描述符+1; readfds/writefds/exceptfds:分别表示可读,可写,异常事件的集合。 timeout:是一个结构体timeval,用来设置select()的等待时间。 参数timeout的取值: NULL:则表示没有select()没有timeout,select将会永久阻塞 0 :仅检测描述符集合的状态,然后立即返回,并不等待外部事件的发生。 特定的时间值:如果在指定的时间中没有事件的发生,select将会超时返回。 select的优缺点: 1.select所能监控的描述符数量有上限-----1024(其上限主要取决于_FD_SETSIZE); 2

select模型

℡╲_俬逩灬. 提交于 2019-11-27 21:31:39
select 模型 select函数 #include <sys/select.h> /* According to earlier standards */ #include <sys/time.h> #include <sys/types.h> #include <unistd.h> int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); nfds: 监控的文件描述符集里最大文件描述符加1,因为此参数会告诉内核检测前多少个文件描述符的状态 readfds:监控有读数据到达文件描述符集合,传入传出参数 writefds:监控写数据到达文件描述符集合,传入传出参数 exceptfds:监控异常发生达文件描述符集合,如带外数据到达异常,传入传出参数 timeout:定时阻塞监控时间,3种情况 1.NULL,永远等下去 2.设置timeval,等待固定时间 3.设置timeval里时间均为0,检查描述字后立即返回,轮询 struct timeval { long tv_sec; /* seconds */ long tv_usec; /* microseconds */ }; void FD_CLR(int fd, fd_set *set);

slect fd_set

丶灬走出姿态 提交于 2019-11-27 21:07:08
select()机制中提供一fd_set的数据结构,实际上是一long类型的数组,每一个数组元素都能与一打开的文件句柄(不管是socket句柄,还是其他文件或命名管道或设备句柄)建立联系,建立联系的工作由程序员完成,当调用select()时,由内核根据IO状态修改fd_set的内容,由此来通知执行了select()的进程哪一socket或文件发生了可读或可写事件 fd_set set; FD_ZERO(&set); /*将set清零使集合中不含任何fd*/ FD_SET(fd, &set); /*将fd加入set集合*/ FD_CLR(fd, &set); /*将fd从set集合中清除*/ FD_ISSET(fd, &set); /*在调用select()函数后,用FD_ISSET来检测fd是否在set集合中,当检测到fd在set中则返回真,否则,返回假(0)*/ 以上式子中的fd为socket句柄。 #include <sys/select.h> #include <unistd.h> int main(int argc, char **argv){ fd_set fdset; FD_ZERO (&fdset); /*清空集合中所有的元素*/ FD_SET(STDOUT_FILENO,&fdset); /*设置stdout,使集合中包含stdout*/ if(FD_ISSET