EPOLL + 事件驱动

此博客展示了一段C语言代码,利用eventfd和epoll实现多线程事件处理。代码创建了两个eventfd事件,将其注册到epoll实例中,创建子线程向eventfd写入数据,主线程通过epoll_wait监听事件并读取数据,实现事件的响应和处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <sys/eventfd.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <sys/epoll.h>
#include <string.h>
#include <pthread.h>

int g_iEvtfd = -1;
int g_iEvtfd1 = -1;

void *eventfd_child_Task(void *pArg)
{
    uint64_t uiWrite = 1;
    while(1)
    {
        uiWrite++;
        write(g_iEvtfd, &uiWrite, sizeof(uiWrite));
        uiWrite++;
        write(g_iEvtfd1, &uiWrite, sizeof(uiWrite));
    }
 return 0;
}

int main(int argc, char**argv)
{
    int iEvtfd, iEvtfd1;
    uint64_t uiRead = 100;
    ssize_t s;
    int iEpfd;
    struct epoll_event stEvent;
    int iRet = 0;
    struct epoll_event stEpEvent[2];
    pthread_t stWthread;

    iEpfd = epoll_create(10);                       //创建EPOLL
    printf("epoll iEpfd = %d\n", iEpfd);

    iEvtfd = eventfd(0, EFD_NONBLOCK);             //产生事件evenfd
    printf("epoll iEvtfd = %d\n", iEvtfd);
    g_iEvtfd = iEvtfd;

    memset(&stEvent, 0, sizeof(struct epoll_event));
    stEvent.events = (unsigned long) EPOLLIN;
    stEvent.data.fd = iEvtfd;
    iRet = epoll_ctl(iEpfd, EPOLL_CTL_ADD, g_iEvtfd, &stEvent); //注册evenfd到EPOLL

    struct epoll_event stEvent2;                     //产生事件evenfd2
    iEvtfd1 = eventfd(0, EFD_NONBLOCK);
    printf("epoll iEvtfd1 = %d\n", iEvtfd1);
    stEvent2.events = (unsigned long) EPOLLIN;
    stEvent2.data.fd = iEvtfd1;
    g_iEvtfd1 = iEvtfd1;

    iRet = epoll_ctl(iEpfd, EPOLL_CTL_ADD, g_iEvtfd1, &stEvent2);  //注册evenfd2到EPOLL

    s = eventfd_read(g_iEvtfd1, &uiRead);
     printf("s = %ld\n", s);
     if (!s)
     {
         printf("Read %lu from iEvtfd = %d\n", uiRead, g_iEvtfd1);
     }

    iRet = pthread_create(&stWthread, NULL, eventfd_child_Task, NULL);   //创建线程写入evenfd


    for(;;)
    {
        iRet = epoll_wait(iEpfd, stEpEvent, 2, -1);
        printf("iRet = %d\n", iRet);
        for(int i =0;i<iRet;i++)
        {
            s = read(stEpEvent[i].data.fd, &uiRead, sizeof(uiRead));
            printf("s = %ld\n", s);
            if (s)
            {
                printf("Read %lu from iEvtfd = %d\n", uiRead, stEpEvent[i].data.fd);
            }
        }
        printf("#############\n\n\n");
    }

    close(g_iEvtfd);
    close(iEpfd);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值