poll读取键盘鼠标,多路复用io

原创 2016年08月29日 20:21:02

poll描述概要:
       #include <poll.h>
       int poll(struct pollfd *fds, nfds_t nfds, int timeout);


The set of file descriptors to be monitored is  specified  in  the  fds
argument, which is an array of structures of the following form:

 struct pollfd {
               int   fd;         /* file descriptor */
               short events;     /* requested events */
               short revents;    /* returned events */
           };


  The  bits that may be set/returned in events and revents are defined in
       <poll.h>:


              POLLIN There is data to read.


              POLLPRI
                     There is urgent data to read (e.g., out-of-band  data  on
                     TCP socket; pseudoterminal master in packet mode has seen
                     state change in slave).


              POLLOUT
                     Writing now will not block.


              POLLRDHUP (since Linux 2.6.17)
                     Stream socket peer closed connection, or shut down  writ‐
                     ing  half  of  connection.   The _GNU_SOURCE feature test
                     macro must be defined (before including any header files)
                     in order to obtain this definition.


              POLLERR
                     Error condition (output only).


              POLLHUP
                     Hang up (output only).


              POLLNVAL
                     Invalid request: fd not open (output only).


测试代码


#include <stdio.h>

#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <poll.h>

int main(void)
{
// 读取鼠标
int fd = -1, ret = -1;
char buf[200];
struct pollfd myfds[2] = {0};

fd = open("/dev/input/mouse1", O_RDONLY);
if (fd < 0)
{
perror("open:");
return -1;
}

// 初始化我们的pollfd
myfds[0].fd = 0; // 键盘
myfds[0].events = POLLIN; // 等待读操作

myfds[1].fd = fd; // 鼠标
myfds[1].events = POLLIN; // 等待读操作


ret = poll(myfds, fd+1, 10000);
if (ret < 0)
{
perror("poll: ");
return -1;
}
else if (ret == 0)
{
printf("超时了\n");
}
else
{
// 等到了一路IO,然后去监测到底是哪个IO到了,处理之
if (myfds[0].events == myfds[0].revents)
{
// 这里处理键盘
memset(buf, 0, sizeof(buf));
read(0, buf, 5);
printf("键盘读出的内容是:[%s].\n", buf);
}

if (myfds[1].events == myfds[1].revents)
{
// 这里处理鼠标
memset(buf, 0, sizeof(buf));
read(fd, buf, 50);
printf("鼠标读出的内容是:[%s].\n", buf);
}
}


return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

IO多路复用之poll——完整代码

  • 2015年02月10日 20:03
  • 267KB
  • 下载

三种多路复用IO实现方式:select,poll,epoll的区别

select,poll,epoll都是IO多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select...

IO多路复用之select、poll、epoll详解

聊聊IO多路复用之select、poll、epoll详解 IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程。IO多路复用适用如下场合:...

IO多路复用:select、poll、epoll示例

一、IO多路复用所谓IO多路复用,就是通过一种机制,一个进程可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。Linux支持IO多路复用的系统调用有se...

IO多路复用之select、poll、epoll详解

目前支持I/O多路复用的系统调用有 select,pselect,poll,epoll,I/O多路复用就是通过一种机制,一个进程可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通...

服务器基础:IO多路复用之select、poll、epoll详解

select、poll、epoll详解IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程。IO多路复用适用如下场合:当客户处理多个描述符时(一般是交互式输入和网络套接口...

IO多路复用之poll总结

转自:http://www.cnblogs.com/Anker/p/3261006.html 1、基本知识   poll的机制与select类似,与select在本质上没有多大差别,管理多...

IO多路复用select,poll,epoll的区别

 select,poll,epoll都是IO多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。但se...

IO多路复用:select、poll、epoll

一、同步异步、阻塞非阻塞的概念区分首先,一个 输入操作通常包括两个不同的阶段:(1)等待数据准备好(2)从内核向进程复制数据对于一个套接字上的输入操作,第一步通常涉及等待数据从网络中到达。当所等待分组...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:poll读取键盘鼠标,多路复用io
举报原因:
原因补充:

(最多只允许输入30个字)