系统编程之高级文件IO(十三)——IO多路复用-select

简介: 系统编程之高级文件IO(十三)——IO多路复用-select

一、IO多路复用


IO多路复用就是IO被阻塞状态下,做其他事情


二、select


实现功能:监听;可以监听很多的文件描述符

原型:int select(int maxfd, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, const struct timeval *timeout)

fd_set:文件描述符集合,一个容器,可以保存很数据(文件描述符)的数组

maxfd:文件描述符的范围,比待检的最大文件描述符大1

readfds:被读监控的文件描述符集

writefds:被写监控的文件描述符集

exceptfds:被异常监控的文件描述符集

timeval:系统定义时间


返回值,成功返回变化的个数、失败返回-1

一般用来监听读


#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/stat.h>
int main(int argc, char const *argv[])
{
    struct timeval time;
    fd_set r_set;
    fd_set all_set;
    time.tv_sec = 3;
    time.tv_usec = 0;
    int fd;
    if((fd = open("/dev/input/mouse0", O_RDWR | O_CREAT, 0655)) < 0)
    {
        perror("open file error!");
        exit(1);
    }
    FD_SET(fd, &r_set);
    FD_SET(0, &r_set);
    all_set = r_set; //暂存如all_set
    while (1)
    {
        r_set = all_set;  //每次都进行置位,不然之后每次只会监听变化的那个
        int ret = select(fd + 1, &r_set, NULL, NULL, NULL );
        if (FD_ISSET(fd, &r_set) > 0)
        {
            int cor;
            read(fd, &cor, sizeof(cor));
            printf("cor = %d\n", cor);
        }
        if (FD_ISSET(0, &r_set) > 0)
        {
            char buffer[1024];
            read(0, buffer, sizeof(buffer));
            printf("buffer = %s\n", buffer);
        }
    }
    return 0;
}


附、一些补充


fd_set……


0a2653c851af460fa595bd959398a8f1.png


timeval


int select(int maxfd, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, const struct timeval *timeout)


(百度解释)

参数一:最大的文件描述符加1。

参数二:用于检查可读性,

参数三:用于检查可写性,

参数四:用于检查带外数据,

参数五:一个指向timeval结构的指针,用于决定select等待I/o的最长时间,等完直接回来。如果为空将一直等待(NULL)。

timeval结构的定义:


struct timeval
{
  long tv_sec; // seconds秒
  long tv_usec; // microseconds毫秒
}

0a2653c851af460fa595bd959398a8f1.png

相关文章
|
1月前
|
存储 监控 Linux
【Linux IO多路复用 】 Linux下select函数全解析:驾驭I-O复用的高效之道
【Linux IO多路复用 】 Linux下select函数全解析:驾驭I-O复用的高效之道
53 0
|
1月前
|
缓存 Linux API
文件IO和标准IO的区别
文件IO和标准IO的区别
22 2
|
2月前
|
缓存 运维 Linux
Linux系统调优详解(十二)——IO调优之磁盘测速
Linux系统调优详解(十二)——IO调优之磁盘测速
58 1
|
2月前
|
运维 Linux
Linux系统调优详解(五)——磁盘IO状态查看命令
Linux系统调优详解(五)——磁盘IO状态查看命令
53 5
|
14天前
|
存储 固态存储 Java
文件IO讲解
文件IO讲解
31 0
|
1月前
|
算法 大数据 数据处理
【软件设计师备考 专题 】IO控制方式(中断系统、DMA、IO处理机方式)
【软件设计师备考 专题 】IO控制方式(中断系统、DMA、IO处理机方式)
41 1
|
1月前
|
NoSQL Java Linux
【Linux IO多路复用 】 Linux 网络编程 认知负荷与Epoll:高性能I-O多路复用的实现与优化
【Linux IO多路复用 】 Linux 网络编程 认知负荷与Epoll:高性能I-O多路复用的实现与优化
62 0
|
1月前
|
Java 大数据 数据库
【Spring底层原理高级进阶】Spring Batch清洗和转换数据,一键处理繁杂数据!Spring Batch是如何实现IO流优化的?本文详解!
【Spring底层原理高级进阶】Spring Batch清洗和转换数据,一键处理繁杂数据!Spring Batch是如何实现IO流优化的?本文详解!
|
1月前
|
JavaScript Unix Linux
IO多路复用:提高网络应用性能的利器
IO多路复用:提高网络应用性能的利器
|
2月前
|
API
使用commons-io-2.0 API来实现监听文件变化
使用commons-io-2.0 API来实现监听文件变化