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;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

使用poll实现的io多路复用服务端和客户端

使用poll实现的io多路复用服务端和客户端。 客户端通过子进程创建多个客户端连接。 客户端每隔1秒向服务端发送一个时间戳, 服务端接收到时间戳以后,保存在本地的文件中, 一个客户端对应一个存储文件,...

IO多路复用之poll总结

1、基本知识   poll的机制与select类似,与select在本质上没有多大差别,管理多个描述符也是进行轮询,根据描述符的状态进行处理,但是poll没有最大文件描述符数量的限制。poll和se...

IO多路复用之select、poll以及epoll

进程的阻塞处理运行态的进程(获得CPU资源),由于需要等待一些事件的发送而不能继续执行时,就会祖东的转为阻塞状态,这是,他是不占用CPU资源的。因此也只有处于运行态的进程,才能够转为阻塞状态。这时候调...

IO多路复用之poll总结

1、基本知识   poll的机制与select类似,与select在本质上没有多大差别,管理多个描述符也是进行轮询,根据描述符的状态进行处理,但是poll没有最大文件描述符数量的限制。poll和...

IO多路复用之poll总结

1、基本知识   poll的机制与select类似,与select在本质上没有多大差别,管理多个描述符也是进行轮询,根据描述符的状态进行处理,但是poll没有最大文件描述符数量的限制。poll和...

IO多路复用之poll

poll和select区别: ① poll服务器监视的文件描述符无上限; ② poll将输入、输出参数进行分离。一、poll函数 函数格式如下所示:#include int poll ( st...

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

一、IO多路复用所谓IO多路复用,就是通过一种机制,一个进程可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。Linux支持IO多路复用的系统调用有se...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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