Linux C selec

来源:互联网 发布:手机炒股软件排名 编辑:程序博客网 时间:2024/05/01 07:16

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);        }    }}

结果如下:
这里写图片描述

0 0
原创粉丝点击