首页 > 解决方案 > epoll_ctl() 返回 EINVAL

问题描述

我正在尝试编写一个 epoll TCP 服务器,我不确定为什么 epoll_ctl 返回 errno (EINVAL)。

根据手册:“EINVAL - 参数epfd无效,或与fd相同,或不支持参数op指定的操作。”

  1. 参数epfd无效:epoll_create()返回0,有效。
  2. 和fd一样:gdb表明它们是不同的。
  3. 不支持参数op指定的操作:EPOLL_CTL_ADD

代码:

struct epoll_event ep_env;
ep_env.data.fd = mServerFd;
ep_env.events  = EPOLLIN;
if (epoll_ctl(mEpollFd, EPOLL_CTL_ADD, mServerFd, &ep_env) == -1)
{
    std::cerr << "ERROR: TCPServer::epollController() failed."
            << std::endl;
    std::cerr << "ERRNO: " << errno << " - " << std::endl;
    if (errno == EINVAL)
    {
        std::cout << "EINVAL" << std::endl;
    }
    else if (errno == EBADF)
    {
        std::cout << "EBADF" << std::endl;
    }
    else
    {
        std::cout << "else" << std::endl;
    }
}

gdb:
[New Thread 0x7ffff6fd2700 (LWP 28133)]
Server initialized. Listening on port 5000...
[Switching to Thread 0x7ffff6fd2700 (LWP 28133)]

Thread 2 "messagePort" hit Breakpoint 1, TCPServer::run (this=0x60d0a0)
    at .../TCPServer.cpp:169
169         if (epoll_ctl(mEpollFd, EPOLL_CTL_ADD, mServerFd, &ep_env) == -1)
(gdb) print mServerFd
$1 = 3
(gdb) print mEpollFd
$2 = 0
(gdb) print ep_env
$3 = {events = 1, data = {ptr = 0x3, fd = 3, u32 = 3, u64 = 3}}
(gdb) step
171             std::cerr << "ERROR: TCPServer::epollController() failed."
(gdb)


Output from exe:
Server initialized. Listening on port 5000...
ERROR: TCPServer::epollController() failed.
ERRNO: 22 - EINVAL

任何输入表示赞赏!

标签: c++epoll

解决方案


推荐阅读