Linux C select 小结:
忘记select怎么用了 今天回忆了一下!
新手 一起学习!.
select原型
int select(int maxnfds, fd_set *readfds, fd_set *writefds,fd_set*exceptfds, struct timeval *timeout);
select 函数参数
maxnfds 最大的文件描述符的值再加1
fd_set *readfds 在这个集合里 检查fd_set文件描述符是否可读
fd_set *writefds 在这个集合里 检查fd_set文件描述符是否可写
fd_set*exceptfds在这个集合里 检查fd_set文件描述符是否有异常
struct timeval *timeout 在这个集合里 等待的时间 设置NULL的话 一直等待(阻塞状态)
把时间设置问0秒0`毫秒,就是一个 纯粹的非阻塞函数,不管文件描述符是否变化,都立刻返回执行,无变化返回0
把时间设置大于0,这就是等待的超时时间
struct timeval tv;
tv.ev_sec = 1;
tv.tv_usec =500000
select举例:
在ubuntu14.04下测试
#include<sys/types.h>
#include<sys/time.h>
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/ioctl.h>
#include<sys/select.h>
int main()
{
int fd_mice = open("/dev/input/mice", O_RDONLY);
int fd_keyb = open("/dev/input/event1", O_RDONLY);
int readlen;
char buf[1024];
while(1)
{
// sigset_t
// 集合
fd_set set;
FD_ZERO(&set); //清空集合
FD_SET(fd_mice, &set);
FD_SET(fd_keyb, &set);
int nfds = fd_keyb + 1;
struct timeval tv;
tv.tv_sec = 2;
tv.tv_usec = 0;
// select是阻塞的函数,它的执行条件是,集合中有文件描述符有事件
// 或者超时
int ret = select(nfds, &set, NULL, NULL, &tv);
// 返回值代表了select返回的有事件的文件描述符个数
if(ret == 0)
{
printf("鼠标和键盘都没有动\n");
}
if(FD_ISSET(fd_mice, &set))
{
readlen = read(fd_mice, buf, sizeof(buf));
printf("鼠标动了, readlen=%d\n", readlen);
}
if(FD_ISSET(fd_keyb, &set))
{
readlen = read(fd_keyb, buf, sizeof(buf));
printf("键盘动了, readlen=%d\n", readlen);
}
}
}
结果如下: