select函数用法

来源:互联网 发布:哪里购买域名比较好 编辑:程序博客网 时间:2024/05/17 09:15

select函数可以实现I/O多路复用,简单地说就是一个线程最多可以监听1024个I/O,一旦某一个I/O就绪,就可以进行相应的读写操作。

函数原型:int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

参数说明:

nfds:最大文件描述符+1,因为描述符编号从0开始,所以要在最大描述符编号上加1。实际上就是要检查的描述符。

readfds、writefds、exceptfds:这三个参数是指向fd_set结构体的指针,其中readfds表示文件描述符集合中是否有可读的文件描述符,如果有,select()就会返回一个大于0的数,表示有文件可读,如果没有,再根据timout的值判断是否超时,如果超时select()返回0,若发生错误,select()返回负值,也可以传入NULL,表示不关心任何文件描述符的可读情况。类似的,writefds记录文件描述符中的可写情况,exceptfds记录文件描述符中的错误异常情况。

timeout:设置超时时间

struct timeval {

time_t         tv_sec;     /* seconds */
suseconds_t    tv_usec;    /* microseconds */
};

timeout==NULL,表示永远等待。

timeout->tv_sec==0 && timeout->tv_usec==0,表示不等待。

timeout->tv_sec!=0 && timeout->tv_usec!=0,表示等待指定的毫秒数和微妙数。


void FD_CLR(int fd, fd_set *set); //清除fd_set 结构体中的fd成员

int  FD_ISSET(int fd, fd_set *set);//检测fd_set 结构体中fd成员是否为真

void FD_SET(int fd, fd_set *set);//设置fd_set 结构体中fd成员

void FD_ZERO(fd_set *set);//清空fd_set 结构体

demo:

#include <stdio.h>  #include <stdlib.h>  #include <string.h>  #include <sys/types.h>  #include <errno.h>  #include <sys/select.h>#include <sys/types.h>#include <sys/time.h>#include <unistd.h>#include <fcntl.h>  #include <errno.h>  #include <time.h>  #include <linux/input.h>#define DEVICE "/dev/input/event0" int main(int argc, char **argv)  {      int fd = 0;      fd_set readfd;    struct timeval tv;     int ret;    struct input_event t;      FD_ZERO(&readfd);    fd = open(DEVICE, O_RDONLY);    FD_SET(fd, &readfd);    tv.tv_sec = 5;    tv.tv_usec = 0;    printf("open %s fd = %d\n",DEVICE ,fd);         ret = select(fd+1, &readfd, NULL, NULL, NULL);      if (ret < 0) {        perror("nselect");    } else if (ret == 0) {        printf("timeout\n");    } else {        printf("ret = %d\n",ret);    }       if (FD_ISSET(fd, &readfd)) {        if(read(fd, &t, sizeof(t)) == sizeof(t)) {            printf("type = %d, code = %d, value = %s\n",t.type, t.code, (t.value) ? "Pressed" : "Released");        }       }    close(fd);    return 0;}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 服务类没有进项票怎么办 教师对学生缺乏耐心怎么办 买了竹料烂尾楼怎么办 刚毕业想换工作怎么办 客厅灯变不了光怎么办 塑料镀铝浸底漆咬底怎么办 标志408钥匙掉了怎么办 房本测绘页丢了怎么办 房本测绘页信息有误怎么办 税务登记证办完没有年检怎么办 建筑施工升降机司机证怎么办 北京建筑施工证怎么办呢 模拟城市5水抽干了怎么办 ip地址错误网络无法接通怎么办 rhino模型太大打开半天怎么办 日本新干线车票丢了怎么办 房间太干燥怎么办又热 薄荷叶子全干了怎么办 水培栀子花叶子蔫了怎么办 薄荷叶叶边干了怎么办 碗莲叶子发黑腐烂怎么办 龟背叶叶子蔫了怎么办 夏天龟背竹蔫了怎么办 春羽叶子长黄斑怎么办 百合竹叶子发黄掉落怎么办 凤尾蕨叶子蔫了怎么办 绿地珊瑚蕨干了怎么办 翠云草叶子蔫了怎么办 珊瑚蕨叶子烂了怎么办 黑骨茶叶子黑斑怎么办 外场主持没有人互动怎么办 企业年报填错了怎么办 手机忘了放哪了怎么办 燃气卡车没气了怎么办 老房子拆了重建怎么办 加了差的汽油怎么办 事业单位未满5年怎么办 小学孩子不会制订学习计划怎么办 忘记提交原创怎么办百度熊掌号 计算机一级报名表填错了怎么办 离婚了不给孩子生活费怎么办