当前位置: 首页 > 面试题库 >

具有边缘触发事件的epoll

袁鸿畅
2023-03-14
问题内容

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 | EPOLLET;
            ev.data.fd = conn_sock;
            if (epoll_ctl(epollfd, EPOLL_CTL_ADD, conn_sock,
                    &ev) == -1) {
                perror("epoll_ctl: conn_sock");
                exit(EXIT_FAILURE);
            }
        } else {
            do_use_fd(events[n].data.fd);
        }
    }
}

在do_use_fd函数中,我在while循环中调用非阻塞recv直到EAGAIN为止,示例代码运行良好。

我对此示例代码有一个疑问,假设现在我有50个套接字客户端连接,突然有10个客户端同时写入数据,因此epoll_wait()将返回10,然后转到for循环:

for (n = 0; n < nfds; ++n)

它将调用 do_use_fd(events[n].data.fd); 这10个客户端,假设n = 5完成,并且n =
6尚未完成,则在所有这10个事件都完成之后,事件n = 3的文件描述突然接收到新数据,并返回epoll_wait
,该事件是否会通知我,有一个客户端需要读取新数据?否则我会错过它,因为当事件发生时,代码不在epoll_wait中!


问题答案:

只要您一直阅读直到遇到EAGAIN错误,您下次调用时都会得到该事件epoll_wait

仅当在空值和非空值之间(或的完整和不完整EPOLLOUT)之间发生更改时才触发该事件,但是该状态将保持不变,直到通过发送事件为止epoll_wait

有点相关的注释:如果您注册EPOLLINEPOLLOUT事件,并且假设您从未填满发送缓冲区,那么每次触发EPOLLOUT返回的事件中,您仍然会获得标志集-
请参见https://lkml.org/lkml/2011 /
11/17/234了解更多详细说明。epoll_wait``EPOLLIN

最后,边沿触发模式的确切行为实际上取决于所使用的套接字类型,并且在任何地方都没有实际记载。我前段时间做了一些测试,并在这里记录了我的发现:http
:
//cmeerw.org/blog/753.html#753-简而言之,对于数据报套接字,您可能会收到比预期更多的事件。



 类似资料:
  • Haskell库中是否存在这种数据结构?我做了一些搜索,但找不到任何有用的东西。我想使用现有的类型,而不是定义我自己的类型——它似乎应该存在。 这个想法是它与Data. Tree非常相似,但是边可以保存信息和节点。 如果你有一个通过树的路径(类型为[e]),你可以在O(log(n))中找到rootLabel(类型为n)。据我所知,你不能用Data做这件事。树,因为您必须扫描每个节点的子节点,以查找

  • 这是我的测试照片 我正在努力寻找卡片的边缘。但是,正如您所看到的,边缘有些模糊。 在这里找到一些建议:模糊边缘检测如何从python中的模糊图像中找到扭曲矩形的精确角点位置?,但没有一个能产生令人满意的边缘。 完整代码:

  • 使用mui.trigger()方法可以动态触发特定DOM元素上的事件。 .trigger( element , event , data ) element Type: Element 触发事件的DOM元素 event Type: String 事件名字,例如:'tap'、'swipeleft' data Type: Object 需要传递给事件的业务参数 示例 自动触发按钮的点击事件: var

  • 问题内容: 我的整个项目都使用(Bluebird)Promises,但是有一个使用EventEmitter的特定库。 我想要实现以下目标: 我在Promises链中读了EventEmitter的答案。这给了我一种执行’connect’事件的回调的方法。这是我到目前为止所到之处 现在如何进一步链接“ eventB”? 问题答案: 我假设您想为每个事件做不同的事情。即使由的动作触发,您也可以将其视为另

  • 更具体地说,需要计算的加密数据流的计数为7秒。 1秒滚动窗口 可提前1秒计算7秒的滑动窗口 每隔1秒输出全部计数的windowall 我无法对其进行集成测试(即,类似于单元测试,但端到端测试),因为输入有假事件时间,这不会触发 EventTimeTrigger可以为求和计算激发,但以下TumblingProcessingTimeWindow无法触发。我在IT测试代码中有一个30s的线程.睡眠,但在

  • 我正在使用Amazon Transcripbe服务,并试图让CloudWatch事件激发一个Lambda函数,该函数执行对我的API的POST请求。 下面是Lambda函数 我已经将CloudWatch事件配置为监听Amazon Transcripbe服务,特别是监听作业状态更改为或。 这是我认为我的应用程序工作的唯一方式,转录作业是通过亚马逊转录服务调用的,然后当它完成时,点击我的API来更新我