IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> epoll简单测试 -> 正文阅读

[C++知识库]epoll简单测试

本文主要是测试epoll监测多个fd时,当一个fd激活并进行对应处理时,此时另外一个fd被激活,新激活的fd是否会丢失?答案是不会,会在处理完前一个fd后马上处理另外一个fd。

可能问题比较蠢,但是有时想不通,就想验证一下。

下面是例子,

例子

代码如下,

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/epoll.h>
#include <sys/eventfd.h>
#include <thread>

#define handle_error(msg) \
       do { perror(msg); exit(EXIT_FAILURE); } while (0)

bool fRunning = true;

int gEventfd = -1;
int gEventfd2 = -1;

void sig_handler(int signum)
{
    fRunning = false;
    exit(0);
}


void thr_func()
{
    int epollfd = epoll_create1(EPOLL_CLOEXEC); // or epoll_create(1)
    if (epollfd == -1)
    {
        handle_error("epoll_create1");
    }
    
    struct epoll_event evEvent;
    evEvent.events = EPOLLIN; 
    evEvent.data.fd = gEventfd;
    epoll_ctl(epollfd, EPOLL_CTL_ADD, gEventfd, &evEvent);

    struct epoll_event evEvent2;
    evEvent2.events = EPOLLIN; 
    evEvent2.data.fd = gEventfd2;
    epoll_ctl(epollfd, EPOLL_CTL_ADD, gEventfd2, &evEvent2);

    struct epoll_event events[2]; 
    
    
    uint64_t exp = 0;
    int result = 0;
    while (fRunning)
    {
        int nfd = epoll_wait(epollfd, events, 2, -1);
        if (nfd > 0)
        {
            printf("==> start dealing...\n");
            for (int i = 0; i < nfd; ++i)
            {
                exp = 0;
                result = 0;
                
                if (events[i].data.fd == gEventfd)
                {
                    result = read(gEventfd, &exp, sizeof(uint64_t));
                    if (result == sizeof(uint64_t)) 
                    {
                        if (exp == 100)
                        {
                            printf("==> XXX\n");
                            sleep(5);
                            printf("==> yyy\n");
                        }
                    }
                }
                else if (events[i].data.fd == gEventfd2)
                {
                    result = read(gEventfd2, &exp, sizeof(uint64_t));
                    if (result == sizeof(uint64_t)) 
                    {
                        if (exp == 200)
                        {
                            printf("==> XXX2\n");
                        }
                    }
                }
            }

        }

    }
}


void writeEventFd()
{
    uint64_t u = 100;
    write(gEventfd, &u, sizeof(uint64_t));

    sleep(1);

    u = 200;
    write(gEventfd2, &u, sizeof(uint64_t));
}


int main(void)
{
    signal(SIGINT, sig_handler);
    
    gEventfd = eventfd(0, 0);
    if (gEventfd < 0)
    {
        return -1;
    }

    gEventfd2 = eventfd(0, 0);
    if (gEventfd2 < 0)
    {
        return -1;
    }
    
    std::thread t1(thr_func);

    std::thread t2(writeEventFd);

    t1.join();
    t2.join();

    return 0;
}

代码中开启了2个线程t1和t2,t1使用epoll监测2个eventfd,第一个fd的处理函数会延时6秒;t2会先向第一个fd发送通知,过1秒后向第二个fd发送通知。这样在执行第一个fd的处理函数时,第二个fd的通知也会到来。

打印如下,
在这里插入图片描述
可以看到当第一个fd的处理函数执行完毕后,会马上执行第二个fd的处理函数,不会丢失。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-18 17:26:01  更:2022-05-18 17:28:16 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/13 18:44:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码