c++ - epoll_ctl() 返回 EINVAL
问题描述
我正在尝试编写一个 epoll TCP 服务器,我不确定为什么 epoll_ctl 返回 errno (EINVAL)。
根据手册:“EINVAL - 参数epfd无效,或与fd相同,或不支持参数op指定的操作。”
- 参数epfd无效:epoll_create()返回0,有效。
- 和fd一样:gdb表明它们是不同的。
- 不支持参数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
任何输入表示赞赏!
解决方案
推荐阅读
- sql - 在 hive 中,如何将列转换为行
- reactjs - 在我的反应路由的开关组件中,如果我添加注册路由,则来自产品屏幕路由的图像未定义
- python - 从字符串中查找元音子字符串
- python - 熊猫比较列标题和插入列
- embedded - DJI Manifold 2(在 nvidia jetson tx2 上运行)USB 设备在使用 Ubuntu 的软件更新更新后无法工作
- admob - 将我的应用程序连接到 Admob 内的应用程序商店后,在 App Store 中查看链接不起作用
- flutter - Flutter 如何将所有的 Widget 放入一个 List
? - python - 如何在 VScode for Python 中将 PowerShell 终端更改为简单的终端?
- google-play-console - 为什么 Android 应用程序在一周后仍处于审核状态?
- git - 如何使用 hpanel 正确部署 git repo