#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;
}