- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有两次调用 event_wait。
线程 1:监听来自子进程的管道
struct epoll_event *ev;
struct EpollStub stub[pool->plugins.count];
...
epollfd = epoll_create1(0);
if (epollfd == -1) {
return -1;
}
ev->events = EPOLLIN;
for(int i=0;i<plugins->count;i++) {
inf = &plugins->stp[i];
stub[i].type = EREAD_STAP;
stub[i].pointer = inf;
ev->data.ptr = stub+i;
if (epoll_ctl(pool->epollfd, EPOLL_CTL_ADD, inf->fd, ev) == -1) {
close(epollfd);
return -1;
}
}
do {
n = epoll_wait(pool->epollfd, evs, EPOLL_EVENTS_MAX, -1);
for(int i=0;i<n;i++) {
ev = evs + i;
struct EpollStub *stub = (struct EpollStub *)ev->data.ptr;
if(stub->type!=EREAD_STAP) {
#ifdef __MDEBUG
printf("EREAD: Wrong event: %d\n",stub->type);
#endif
continue;
}
else {
// inf = (struct StpInfo*)ev->data.ptr;
inf = (struct StpInfo*)stub->pointer;
fd = inf->fd;
#ifdef __MDEBUG
printf("EREAD fd: %d\n",fd);
#endif
///do something here
}
....
线程 2:监听客户端套接字
struct epoll_event ev;
pool->epollfd = epoll_create1(0);
if (pool->epollfd == -1) {
return -1;
}
ev.events = EPOLLIN;
for(int i=0;i<pool->sockets.count;i++) {
struct EpollStub *stub = &pool->sockets.stub[i];
stub->type = EACCEPT_CONN;
stub->pointer = pool->sockets.fd[i];
ev.data.ptr = stub;
if (epoll_ctl(pool->epollfd, EPOLL_CTL_ADD, (int)stub->pointer, &ev) = -1) {
return -1;
}
}
...
cfd = epoll_wait(pool->epollfd, &ev, 1, -1);
if(is_working(pool,cfd)) {
struct EpollStub *stub = (struct EpollStub *)ev.data.ptr;
if(stub->type!=EACCEPT_CONN) {
#ifdef __MDEBUG
printf("EACCEPT: Wrong event: %d\n",stub->type);
#endif
}
else {
#ifdef __MDEBUG
printf("EACCEPT fd: %d\n",(int)stub->pointer);
#endif
break;
///do something here
}
}
....
内核:opensuse-3.1.0-1.2-desktop
他们从彼此那里获取事件。我制作 EpollStub 只是为了确保他们得到。如果没有这个第一个事件返回一个指针,第二个返回一个句柄,结果是在接收描述符并将其用作指针时出现段错误。
我不认为这是正常行为。这是内核中的错误还是我哪里错了?
最佳答案
这是您代码中的错误。您在一些地方将 pool->epollfd
与 epollfd
混淆了,例如:
epollfd = epoll_create1(0);
if (epollfd == -1) {
return -1;
}
ev->events = EPOLLIN;
for(int i=0;i<plugins->count;i++) {
inf = &plugins->stp[i];
stub[i].type = EREAD_STAP;
stub[i].pointer = inf;
ev->data.ptr = stub+i;
if (epoll_ctl(pool->epollfd, EPOLL_CTL_ADD, inf->fd, ev) == -1) {
close(epollfd);
return -1;
}
}
do {
n = epoll_wait(pool->epollfd, evs, EPOLL_EVENTS_MAX, -1);
您创建 epollfd
,然后修改 pool->epollfd
并等待它。如果你有两个不同的事件集,你需要使用两个不同的 epoll fds。
epoll 机制是完全线程不可知的。它不绑定(bind)事件或设置到线程。任何线程都可以在集合中添加或删除描述符。任何线程都可以获得任何集合的事件。
关于c - 不同线程中的多个 epoll_wait 接收不是为它们设计的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8515225/
我正在考虑基于 epoll 编写一个 tcp 服务器. 为了获得最佳性能,我也想实现多核支持。但在我的研究过程中,出现了以下问题: 叫两个更快吗epoll_wait() - 来自两个不同线程的调用,每
使用epoll_wait时,它似乎会“吃掉”写入stdout的所有内容,并延迟打印,直到epoll_wait收到事件之后,即使我尝试在调用与 epoll 相关的任何内容之前进行打印(它甚至可能位于我的
我有一个 Connection 对象,代表一个由 epoll 管理的连接。在发生事件时,调用 Connection::eventWrite() 或 Connection::eventRead()。连接
epoll_wait() 的第二个参数是大小为 sizeof (struct epoll_event) * 调用者期望(或监视)的事件总数(文件描述符)的缓冲区。在第一次传递给 epoll_wait(
我的应用程序在 epoll_wait 中等待的时间比我在超时中指定的时间长得多: 22578 09:33:46.959791 epoll_wait(5, 22578 09:33:50.010794
我已经编写了一个简单的 TCP 服务器套接字并将 fd 添加到 epoll_cntl。客户端连接后,accept fd也被添加到epoll_cntl中。 当客户端关闭时,我通过 epoll_wait
请原谅我的长篇文章。我会发布代码,以便更容易理解我面临的问题。似乎如果将信号套接字添加到 epoll 实例,则 epoll 实例上的 epoll_wait 不会阻塞。下面的例子让我相信了这一点: #i
我的应用程序使用 epoll_wait 来执行定时等待 IO 事件。如果没有事件发生,epoll_wait 应该在超时后返回并且我的应用程序继续。 在测试期间,有人将系统时钟调慢了一天,我的应用程序中
我正在使用一个多线程嵌入式应用程序,其中 epoll 用于其中一个线程中的 IO。我依赖于 epoll 的一个特定功能,该功能指定关闭文件描述符会自动将其从 epoll 集中删除(man 7 epol
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout); 我对 maxevents 参数有点困
When successful, epoll_wait(2) returns the number of file descriptors ready for the requested I/O, o
所以我有一些看起来像这样的代码: for (;;) { errno=0; epoll_event e = {}; auto wait_r = epoll
我有两次调用 event_wait。 线程 1:监听来自子进程的管道 struct epoll_event *ev; struct EpollStub stub[poo
所以....我很困惑为什么我的基于 epoll 的 tcp 服务器随机挂起 epoll_wait,然后在我用 SIGINT 终止时向某些连接发送一个空数组。 事实证明,我的软件中有一个随机错误,导致我
1) 我有 epoll_wait(..., events, ...) 循环,我需要在每次迭代前重新初始化 events 数组吗? 2) 根据epoll() 手册例子没有必要,是不是搞错了? 3) 我还
我无法从 epoll 文档中理解这一点:假设我有 pipe(fd) 所以我们有 fd[0] 用于读取和 fd[ 1] 用于书写。我们向 fd[1] 写入一些内容,然后将其关闭: write(fd[1]
当我使用此命令检查页面执行时,我面临着较长的 epoll_wait 时间。 strace -o output.txt -f -r -s4096 -p 21605 输出是一个很大的txt文件,但
我有一个线程负责轮询各种fds。我正在使用设置了超时的 epoll_wait。以下是代码片段: do { n = epoll_wait(epollFd, eventsList, eventsT
我正在使用 C++ 和 pthreads 进行一些事件处理。我有一个从我定义的事件队列中读取的主线程,以及一个填充事件队列的工作线程。队列当然是线程安全的。 工作线程有一个文件描述符列表,并创建一个
如果 epoll_wait 被任何原因(例如 SIGINT)中断,我想处理 while ( true ) { n = epoll_wait ( epoll_fd, events, max_ev
我是一名优秀的程序员,十分优秀!