【问题标题】:How to get errno when epoll_wait returns EPOLLERR?epoll_wait返回EPOLLERR时如何获取errno?
【发布时间】:2012-10-20 11:08:51
【问题描述】:

当epoll_wait为特定fd返回EPOLLERR时,有没有办法找出errno?

是否有任何关于错误性质的进一步信息?

编辑:

添加更多信息以防止歧义

epoll_wait 等待多个文件描述符。当你调用 epoll_wait 时,你会传递一个 epoll_event 结构的数组:

struct epoll_event {
           uint32_t     events;    /* Epoll events */
           epoll_data_t data;      /* User data variable */
       };

epoll_data_t 结构与您使用 epoll_ctl 向 epoll 添加文件描述符的结构具有相同的细节:

typedef union epoll_data {
           void    *ptr;
           int      fd;
           uint32_t u32;
           uint64_t u64;
       } epoll_data_t;

我正在寻找的是当 epoll 正在等待的文件描述符之一出现错误时会发生什么。

ie: (epoll_event.events & EPOLLERR) == 1 - 有没有办法找出文件描述符上错误的更多细节?

【问题讨论】:

    标签: linux epoll


    【解决方案1】:

    epoll_wait 在发生错误时返回 -1 并适当地设置 errno。有关详细信息,请参阅“man 2 epoll_wait”。

    【讨论】:

    • 感谢您的回复,但正如您从我的 cmets 对 @HongZhou 的回答中看到的那样,这不是我想要的。我知道如果 epoll_wait 为 epoll 文件描述符返回 -1,我可以使用 errno 来获取错误。我正在寻找的是当 epoll_event.events & EPOLLERR == 1 对于 epoll 正在等待的文件描述符之一时
    【解决方案2】:

    包含 errno.h 并使用 perror 查看错误消息。 基本上错误来自epfd或中断,它不会来自您集合中的文件描述符。

    包括“errno.h”

    if(epoll_wait() == -1)
        {
          perror("Epoll error : ");
        }
    

    【讨论】:

    • 感谢您的回复,但这不是我想要的。我知道如果 epoll_wait 为 epoll 文件描述符返回 -1,我可以使用 errno 来获取错误。我正在寻找的是当 epoll_event.events & EPOLLERR == 1 对于 epoll 正在等待的文件描述符之一时
    • 1.EBADF - epfd 不是有效的文件描述符。 2.EFAULT - 事件指向的内存区域不能通过写权限访问。 3.EINTR - 在任何请求的事件发生或超时到期之前,调用被信号处理程序中断;见信号(7)。 4.EINVAL——epfd不是epoll文件描述符,或者maxevents小于等于0。以上是该男子仅有的4个错误。在什么情况下 EPOLLERR == 1?
    • 对于套接字,我使用此标志来检查已关闭的对等点:EPOLLRDHUP。
    • 我不是在寻找 epoll_wait 错误,我在寻找有关由 epoll 监视的文件描述符返回的错误的信息
    【解决方案3】:

    使用 getsockopt 和 SO_ERROR 获取套接字上的未决错误

    int       error = 0;
    socklen_t errlen = sizeof(error);
    if (getsockopt(fd, SOL_SOCKET, SO_ERROR, (void *)&error, &errlen) == 0)
    {
        printf("error = %s\n", strerror(error));
    }
    

    【讨论】:

    • 很抱歉回复晚了 - 这很好 - 谢谢! :)
    【解决方案4】:

    只是一个小问题:您的测试将无法正常工作,原因有两个。如果 EPOLLERR 被定义为 0x8,那么您的测试会将 8 与 1 进行比较(因为 == 的优先级高于 &),给您一个 0,然后将其与事件掩码相乘。

    你想要的是:(epoll_event.events & EPOLLERR) != 0 来测试设置的 EPOLLERR 位。

    【讨论】:

    • 这应该是评论而不是答案
    猜你喜欢
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    • 2011-07-29
    • 2010-11-11
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    相关资源
    最近更新 更多