为什么epoll提供过去事件的数据?

时间:2019-06-24 16:10:31

标签: c++ linux sockets uart

我正在尝试从Linux读取uart串行数据。 我有2个串行设备映射到linux文件系统,例如:ttys1和ttys2。 之后,使用open()获取FD:

int fd1 = open("ttys1", O_RDWR | O_NOCTTY);
int fd2 = open("ttys2", O_RDWR | O_NOCTTY);

例如,此调用位于对象构造函数中,而应用程序处于空闲状态

在“运行”状态下,我想从此设备记录uart数据。

我有一个线程正在调用start()方法,该方法创建一个epoll并将fd1和fd2添加到epoll进行监视:

for(int i = 0 ; i < 2; i++)
{
  events[i].events = EPOLLIN | EPOLLERR | EPOLLET ;
  events[i].data.fd = (i == 0) ? fd1 : fd2;

  if(epoll_ctl(epollFD, EPOLL_CTL_ADD, events[i].data.fd, &events[i]))
  {
    fprintf(stderr, "Failed to add file descriptor to epoll\n");
     close(epollFD);
     return;
   }
   else
   {
   cout << "Succesfully added File Descriptors to ePoll" << endl;
   }
}

此后,我有一个正在运行的线程正在等待epoll事件,并使用epoll_wait()读出数据

我的问题是,第一个事件包含大量要忽略的数据。如果通常在每次epoll等待之后我从每个uart设备中获取1-10个字节,则在第一帧中我从这些设备中获取了缓冲数据,但是我只想在将fd添加到epoll之后监视流量。有任何想法吗 ?谢谢!

0 个答案:

没有答案