系统编程之高级文件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……

在这里插入图片描述

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毫秒
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周末不下雨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值