Articles of epoll

epoll是否保留了fd的注册顺序?

我正在玩Linux系统调用,我发现了epoll一些方面,这是不清楚的。 说,我创build一个epoll实例: epollfd = epoll_create(50); 接下来,我在for -loop中注册了50个文件描述符: for(i=0; i<50; i++){ // open file "file-i".txt // construct epoll_event // register new file descriptor with epoll_ctl(epollfd, EPOLL_CTL_ADD … 现在我们有50个文件,准备行动(读或写 – 无所谓)。 我们将MAX_EVENTS设置为3: #define MAX_EVENTS 3 … struct epoll_event events[MAX_EVENTS] … epoll_wait(epollfd, events, MAX_EVENTS, -1) 所有这50个文件都准备好了,我们只问了其中的3个。 哪些文件将在events数组中? [1,2,3] – 前3个文件,以便他们被添加到epoll [48,49,50] – 最后3个文件,以便他们被添加到epoll [34,7,15] – 随机3个文件 任何其他选项 谢谢。

在不使用Epoll的Linux上升级Asio

我的印象是,boost :: asio会默认使用epoll设置,而不是select实现,但是在运行一些testing之后,看起来像我的设置正在使用select。 操作系统:RHEL 4 内核:2.6 GCC:3.4.6 我写了一个小testing程序来validation哪个反应器头被使用,看起来像使用select反应器而不是epoll反应器。 #include <boost/asio.hpp> #include <string> #include <iostream> std::string output; #if defined(BOOST_ASIO_EPOLL_REACTOR_HPP) int main(void) { std::cout << "you have epoll enabled." << std::endl; } #elif defined(BOOST_ASIO_DETAIL_SELECT_REACTOR_HPP) int main(void) { std::cout << "you have select enabled." << std::endl; } #else int main(void) { std::cout << "this shit is confusing." << […]

一次性*级别* – 触发epoll():EPOLLONESHOT是否意味着EPOLLET?

是否可以在单触式水平触发模式下使用epoll ? search时找不到任何信息; 似乎每个人都使用边缘触发模式。

如何构buildnetty-transport-native-epoll-4.0.32.Final-linux-x86_64.jar?

我在netty中使用本地epoll传输,并能够从存储库下载netty-transport-native-epoll-4.0.32.jar。 但是我也需要netty-transport-native-epoll-4.0.32.Final-linux-x86_64.jar,但是无法在任何地方find它。 请让我知道在哪里下载这个jar,或者如何构build它。

在设备上使用epoll(/ dev / event / …)是否有效?

我正在创build一个单线程的 applet,它创build一个代理虚拟设备(更确切地说是一个虚拟的Xbox 360 pad)。 我设法使用uinput接口创build它,我正确地设置它,它工作得很好。 为了给这个虚拟设备提供命令,我从另一个真实接口(在这个例子中是一个PS3键盘)读取事件,并用这些标记打开真实的设备文件: fd = open("/dev/input/event22", O_RDONLY); // open the PS3 pad 主循环是类似的(减去错误检查): while(run) { input_event ev = {0}; read(fd, &ev, sizeof(struct input_event)); // convert from PS3 –> Xbox 360 convert(ev); // write to the new virtual pad write(fd_virtual, &ev, sizeof(struct input_event)); } 你可以想象read(fd, &ev, sizeof(struct input_event)); 是一个阻塞调用,我想有一个超时周期循环,并检查其他事件/执行其他代码。 由于这些原因,我正在考虑封装read(fd…呼叫epoll循环,所以我也可以有一个超时。 问题是,以这种方式完成是否有效率? 通过使用epoll_wait ,我是否会在当前循环中引入额外的延迟,从而延迟虚拟键盘的响应时间?

为什么我们需要在poll中调用poll_wait?

在LDD3中,我看到了这样的代码 static unsigned int scull_p_poll(struct file *filp, poll_table *wait) { struct scull_pipe *dev = filp->private_data; unsigned int mask = 0; /* * The buffer is circular; it is considered full * if "wp" is right behind "rp" and empty if the * two are equal. */ down(&dev->sem); poll_wait(filp, &dev->inq, wait); poll_wait(filp, &dev->outq, wait); if (dev->rp […]

epoll_wait:maxevents

int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout); 我对maxevents参数有点困惑。 假设我想写一个可以处理高达10k连接的服务器。 我将maxevents定义为10000,还是应该由于某种原因而降低?

普通文件上的Epoll

epoll (在Linux上)对普通文件有用吗? 我知道它主要用于套接字,但只是想知道。

边缘触发事件的epoll

epoll的手册页: http://linux.die.net/man/7/epoll 有一个边缘触发的示例代码,如下所示: for (;;) { nfds = epoll_wait(epollfd, events, MAX_EVENTS, -1); if (nfds == -1) { perror("epoll_pwait"); exit(EXIT_FAILURE); } for (n = 0; n < nfds; ++n) { if (events[n].data.fd == listen_sock) { conn_sock = accept(listen_sock, (struct sockaddr *) &local, &addrlen); if (conn_sock == -1) { perror("accept"); exit(EXIT_FAILURE); } setnonblocking(conn_sock); ev.events = EPOLLIN | […]

如何在使用epoll_wait时正确读取数据

我正尝试将使用IOCP的现有Windows C ++代码移植到Linux。 在决定使用epoll_wait来实现高并发性之后,我已经面临一个理论问题,就是我们何时试图处理接收到的数据。 设想两个线程调用epoll_wait ,并收到两个相应的消息,以便Linux解除第一个线程的epoll_wait ,第二个线程即将到来。 例如: Thread 1 blocks on epoll_wait Thread 2 blocks on epoll_wait Client sends a chunk of data 1 Thread 1 deblocks from epoll_wait, performs recv and tries to process data Client sends a chunk of data 2 Thread 2 deblocks, performs recv and tries to process data. 这种情况是可以想象的吗? […]