Linux C selec

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

    }
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值