关于epool

man中给出了epoll的用法,example程序如下:
       for(;;) {
           nfds = epoll_wait(kdpfd, events, maxevents, -1);

           for(n = 0; n < nfds; ++n) {
               if(events[n].data.fd == listener) {
                   client = accept(listener, (struct sockaddr *) &local,
                                   &addrlen);
                   if(client < 0){
                       perror("accept");
                       continue;
                   }
                   setnonblocking(client);
                   ev.events = EPOLLIN | EPOLLET;
                   ev.data.fd = client;
                   if (epoll_ctl(kdpfd, EPOLL_CTL_ADD, client, &ev) < 0) {
                       fprintf(stderr, "epoll set insertion error: fd=%d/n",
                               client);
                       return -1;
                   }
               }
               else
                   do_use_fd(events[n].data.fd);
           }
       }
此时使用的是ET模式,即,边沿触发,类似于电平触发,epoll中的边沿触发的意思是只对新到的数据进行通知,而内核缓冲区中如果是旧数据则不进行通知,所以在do_use_fd函数中应该使用如下循环,才能将内核缓冲区中的数据读完。
        while (1) {
           len = recv(*******);
           if (len == -1) {
             if(errno == EAGAIN)
                break;
             perror("recv");
             break;
           }
           do something with the recved data........
        }

在上面例子中没有说明对于listen socket fd该如何处理,有的时候会使用两个线程,一个用来监听accept另一个用来监听epoll_wait,如果是这样使用的话,则listen socket fd使用默认的阻塞方式就行了,而如果epoll_wait和accept处于一个线程中,即,全部由epoll_wait进行监听,则,需将listen socket fd也设置成非阻塞的,这样,对accept也应该使用while包起来(类似于上面的recv),因为,epoll_wait返回时只是说有连接到来了,并没有说有几个连接,而且在ET模式下epoll_wait不会再因为上一次的连接还没读完而返回,这种情况确实存在,我因为这个问题而耗费了一天多的时间,这里需要说明的是,每调用一次accept将从内核中的已连接队列中的队头读取一个连接,因为在并发访问的环境下,有可能有多个连接“同时”到达,而epoll_wait只返回了一次。
其实是很简单的问题,对于有经验的人来说根本不会犯这样的错误,而我却耗费了一天多的时间,经验确实太重要了。
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: "epoll read errno" 其实是指 Epoll 系统调用在进行读取操作时出现的错误编号。Epoll 是 Linux 系统中的一个高性能的 I/O 事件通知机制,用于监听文件描述符上的事件并进行相应的处理。当 Epoll 进行读取操作时,可能会发生各种错误,造成读取失败。 其中,errno 是一个全局变量,用于保存最后一次发生错误时的错误编号。 通常情况下,epoll read errno 可能的取值和对应的含义如下: 1. EAGAIN 或 EWOULDBLOCK:表示当前没有可读取的数据,即阻塞状态。 2. EBADF 或 EINVAL:表示被监听的文件描述符无效或者不是一个合法的 socket。 3. EINTR:表示 Epoll 被信号中断,需要重新调用。 4. EFAULT:表示需要读取数据的缓冲区指针无效。 5. ENOMEM:表示内存不足,无法为 Epoll 内部数据结构分配内存空间。 6. 其他错误:比如权限问题、文件已关闭等。 当程序中出现 "epoll read errno" 错误时,我们可以根据具体的错误编号来判断错误的原因,并采取相应的处理措施。可能的处理方法包括:重新尝试读取、更新监听的文件描述符、增加缓冲区大小、检查文件描述符的权限、检查内存使用等。具体的解决方法需要根据实际情况来定,以确保程序的正常运行。 ### 回答2: "epool read errno" 是一个错误信息,通常在使用 Linux 系统中的 epoll I/O 多路复用机制时出现。 在 epoll I/O 多路复用中,使用一个 epoll 对象来监视多个文件描述符(包括套接字和文件)的状态变化。当一个文件描述符准备好进行读操作时,epoll_wait 函数会返回,并且可以通过相应的文件描述符进行读取操作。然而,有时候在调用 epoll_wait 函数时,可能会收到 "epool read errno" 错误。 这个错误通常是由于以下几种情况引起的: 1. epoll 对象没有正确初始化或被关闭了。在使用 epoll_create 函数创建 epoll 对象时,如果返回值为 -1,就说明出错了。 2. epoll_wait 函数的返回值小于 0,表示出错。可以通过读取 errno 变量来获取具体的错误代码。 3. epoll_wait 函数的超时时间参数设置错误,导致超时立即返回,而不是等待任何事件的到来。 解决这个问题的方法包括: 1. 确保正确初始化并正确使用 epoll 对象。如果 epoll_create 函数返回 -1,可以检查 errno 变量来获取具体的错误信息,并相应地处理。 2. 针对 epoll_wait 函数的返回值小于 0 的情况,可以读取 errno 变量来获取具体的错误代码,并进行相应的处理措施。 3. 检查 epoll_wait 函数的超时时间参数是否正确设置。 总之,"epool read errno" 错误是在使用 epoll I/O 多路复用机制时可能会遇到的错误信息,我们需要根据具体的场景和错误代码来进行分析和处理。 ### 回答3: "epoll read errno" 是指使用 epoll 函数进行读操作时出现的错误。epoll 是 Linux 系统中一种高效的 I/O 多路复用机制,允许程序同时监视多个文件描述符,等待其中任何一个文件描述符变为可读或可写状态。而 "epoll read errno" 表示在使用 epoll 进行读操作时出现了错误。 通常,"epoll read errno" 错误的产生是由于以下几个常见原因: 1. 文件描述符错误:epoll 函数对于读操作要求输入参数是一个有效的文件描述符,如果文件描述符无效或已关闭,就会导致 "epoll read errno" 错误。 2. 读取缓冲区不足:当 epoll 函数读取数据时,需要提供一个足够大的缓冲区来存储读取的数据。如果缓冲区不够大,读取的数据可能会被截断,也可能导致 "epoll read errno" 错误。 3. 连接中断或错误状态:在使用 epoll 进行读操作时,如果连接中断或发生错误,epoll 函数会返回相应的错误码,比如 EPIPE、ECONNRESET 等,表示连接发生了错误,从而引发 "epoll read errno" 错误。 为了解决 "epoll read errno" 错误,可以采取以下措施: 1. 检查文件描述符的有效性,确保它是一个有效的、打开的文件描述符。 2. 确保读取缓冲区足够大,可以容纳要读取的数据。 3. 分析错误码,如 EPIPE、ECONNRESET 等,找到具体的错误原因并进行相应的处理。 总之,"epoll read errno" 错误是指在使用 epoll 函数进行读取操作时发生的错误。可以通过检查文件描述符的有效性、确保读取缓冲区足够大以及分析错误码等方式来解决该错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值