网站做实名验证码,semi,企业管理官网登录入口,网站设计的特点select函数#xff08;Unix系统#xff09; 一、函数格式二、参数及返回值2.1 struct fd_set 结构体2.1 struct timeval 结构体2.3 函数参数2.4 返回值 三、用法举例3.1 监控终端输入内容 一、函数格式 #include sys/time.h#include sys/types.h#include Unix系统 一、函数格式二、参数及返回值2.1 struct fd_set 结构体2.1 struct timeval 结构体2.3 函数参数2.4 返回值 三、用法举例3.1 监控终端输入内容 一、函数格式 #include sys/time.h#include sys/types.h#include unistd.hint select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);二、参数及返回值
2.1 struct fd_set 结构体
struct fd_set 可以理解为一个存放文件句柄的集合socket句柄也是文件描述符fd_set集合可通过一些宏人为控制如
FD_ZERO(fd_set *);清空集合FD_SET(int, fd_set *);将指定文件描述符加入集合FD_CLR(int, fd_set*); 将一个给定的文件描述符从集合中删除FD_ISSET(int ,fd_set* )检查集合中指定的文件描述符是否可以读写
2.1 struct timeval 结构体
比较常用用来代表时间值有两个成员一个是秒数另一个是微秒
struct timeval {time_t tv_sec; // seconds long tv_usec; // microseconds
};2.3 函数参数
int nfds该整数值用来指示集合中所有文件描述符的范围设置为所有文件描述符中的最大值加1。不能设置错喽。 fd_set *readfds指向fd_set类型结构体的指针监控这些文件描述符的变化看是否可以从这些文件中读数据了。如果有一个文件可读select就返回一个大于0的值若没有可读的文件则根据 time out 参数判断是否超时若超时返回0若发生错误返回负值可以传入NULL表示不关心任何文件的读变化。 fd_set *writefds指向fd_set类型结构体的指针监控这些文件描述符的变化看是否可以从这些文件中写数据了。如果有一个文件可写select就返回一个大于0的值若没有可写的文件则根据 time out 参数判断是否超时若超时返回0若发生错误返回负值可以传入NULL表示不关心任何文件的读变化。 fd_set *exceptfds同上监视文件错误异常。 struct timeval *timeout超时时间可以使select处于三种状态 a、传入NULL则处于阻塞状态即select只有当监控到文件读写状态发生变化才返回。 b、若时间设置为0分0秒则就变成一个纯粹的非阻塞函数不管文件描述符是否变化都立刻返回。文件状态无变化返回0有变化返回一个正值。 c、timeout的值大于零即在设定的时间内被阻塞。超时后返回。
2.4 返回值
负值发生错误正值某些文件可读或者可写或出错0等待超时没有可读可写或错误的文件
三、用法举例
3.1 监控终端输入内容
#include sys/time.h
#include stdio.h
#include sys/types.h
#include sys/stat.h
#include fcntl.h
#include assert.h
#include unistd.hint main ()
{int keyboard;int ret,i;char c;fd_set readfd;struct timeval timeout;keyboard open(/dev/tty,O_RDONLY | O_NONBLOCK);assert(keyboard0);while(1) {timeout.tv_sec1;timeout.tv_usec0;FD_ZERO(readfd);FD_SET(keyboard,readfd);retselect(keyboard1,readfd,NULL,NULL,timeout);if(FD_ISSET(keyboard,readfd)) {iread(keyboard,c,1);if(\nc)continue;if (qc)break;printf(the input is %c \n,c);}}
}