Articles of epoll

在设备上使用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. 这种情况是可以想象的吗? […]

Linux,套接字,非阻塞连接

我想创build一个非阻塞连接。 喜欢这个: socket.connect(); // returns immediately 为此,我使用另一个线程,一个无限循环和Linux epoll。 像这样(伪代码): // in another thread { create_non_block_socket(); connect(); epoll_create(); epoll_ctl(); // subscribe socket to all events while (true) { epoll_wait(); // wait a small time(~100 ms) check_socket(); // check on EPOLLOUT event } } 如果我运行一个服务器,然后运行一个客户端,所有的工作。 如果我第一次运行一个客户端,等待一段时间,运行一个服务器,然后客户端不连接。 我究竟做错了什么? 也许它可以做不同?

什么是匿名inode?

我做了一个关于“匿名inode”的谷歌search,似乎它与epoll有关…但实际上是什么呢?

用epollmultithreadingUDP服务器?

我想在C / Linux中开发一个multithreading的UDP服务器。 该服务在单个端口x上运行,因此只有绑定一个UDP套接字的可能性。 为了在高负载下工作,我有n个线程(静态定义),比如每个CPU有1个线程。 工作可以通过epoll_wait传递给线程,所以线程可以根据需要用'EPOLLET |'唤醒 EPOLLONESHOT”。 我附上了一个代码示例: static int epfd; static sig_atomic_t sigint = 0; … /* Thread routine with epoll_wait */ static void *process_clients(void *pevents) { int rc, i, sock, nfds; struct epoll_event ep, *events = (struct epoll_event *) pevents; while (!sigint) { nfds = epoll_wait(epfd, events, MAX_EVENT_NUM, 500); for (i = […]

提升Asio单线程性能

我正在实现自定义服务器,需要保持非常大的数量(100K或更多)的长期连接。 服务器只是在套接字之间传递消息,并没有做任何严肃的数据处理。 消息很小,但是其中许多消息都是每秒收到/发送的。 减less延迟是目标之一。 我意识到使用多核并不会提高性能,因此我决定通过调用io_service对象的run_one或poll方法在单个线程中运行服务器。 无论如何,multithreading服务器将更难实施。 什么是可能的瓶颈? 系统调用,带宽,完成队列/事件解复用? 我怀疑调度处理程序可能需要locking(这是由asio库内部完成)。 是否有可能禁用boost.asio甚至队列locking(或任何其他locking)? 编辑:相关的问题。 multithreading的系统调用性能是否会提高? 我的感觉是,因为系统调用是由内核primefaces/同步添加更多的线程不会提高速度。