读取一个文件,并开启非阻塞式

  • O_RDONLY:只读

  • O_NONBLOCK:非阻塞

代码编写

int fd;
int init_read()
{
    int fd = open("/dev/input/event1", O_RDONLY | O_NONBLOCK);
    if(fd == -1)
        return -1;
    return 0;
}
int btns_read(int fd, btn_code_t *code, btn_event_t *event)
{
    struct input_event ev; // 输入事件

    ssize_t n = read(fd, &ev, sizeof(ev));
    if (n < 0) { //1.是否有错
        if (errno == EAGAIN || errno == EWOULDBLOCK) 
            return 0;
        return -1;
    }
    if ((size_t)n < sizeof(ev)) //2.返回的数据是不是input_event
        return -1;
    if (ev.type != EV_KEY) //3.如果是按钮才执行
        continue;
    //4.参数传递回去
    *code  = ev.code;
    *event = ev.value ? BTN_PRESSED : BTN_RELEASED;

    printf("btns: fd=%d ev.code=%u ev.value=%d -> btn=%d\n",
           fd, (unsigned)ev.code, ev.value, (int)c);
    fflush(stdout); // 5.fflush 保证日志不卡在缓冲区里
    return 1;
}

解析

  • 开启一个文件设置为非阻塞模式。