使用struct epoll_event处理内存

Bla*_*ain 10 c linux epoll

我正在使用epoll库在C中开发一个服务器,我对如何处理内存有疑问struct epoll_event.我在一些在线示例中注意到,在进行epoll_ctl调用时,events参数在堆栈上分配,然后传递指针,如下所示:

struct epoll_event ev;
ev.events = EPOLLIN;
epoll_ctl(epfd, EPOLL_CTL_ADD, sockfd, &ev);
Run Code Online (Sandbox Code Playgroud)

现在我们都知道ev函数返回时会发生什么.我的问题是:epoll库是否在内部复制这些值,还是依赖于您传递给堆分配的结构?上面的例子会完全破坏我的反应堆实现吗?如果是这样,跟踪堆分配epoll_event结构的最佳方法是什么?

谢谢你的时间.

Ker*_* SB 13

一切都好.该epoll_ctl函数是一个简单的系统调用包装器,当函数返回时它将完全完成.不需要来自用户空间的更多数据.结构只是一种打包参数的方法.

  • 我希望这些信息位于联机帮助页中,并且不需要往返 SO。 (2认同)

Mar*_*rkR 9

立即丢弃或重用epoll_event结构是绝对正确的.

内核将从epoll_event结构中复制参数.

这与使用带有struct作为参数的ioctl或带有struct sockaddr_in的套接字操作(例如bind)完全相同.

内核可以满足它的需要,你可以立即释放它.

您唯一需要担心的是"用户数据",它只与您相关.内核将存储它,但您需要知道在获得事件时它意味着什么.


asv*_*kau 5

epoll是一组系统调用,而不是库。当您调用epoll系统调用时,您会进入内核,而内核通常不相信这些用户模式缓冲区一定有效或存在,而是通过copy_from_user等方式复制到内核内存中。所以是的,您可以在堆栈上设置结构,将它们的地址传递给系统调用,然后在返回后丢弃它们。