上一篇,讲了几个简单的例子,相信你们对poll和epoll,已经有了一个初步了解。这一节,再新增几个case。ui
有几个名词先解释下:事件
epoll_event: 注册所感兴趣的事件和回传所发生待处理的事件。可能的取值为:it
EPOLLIN :表示对应的文件描述符能够读;
EPOLLOUT:表示对应的文件描述符能够写;io
1. epoll边沿出发,有些又有读: event
#include <stdio.h>
#include <sys/eventfd.h>
#include <sys/epoll.h>
#include <memory.h>im
int main()
{
uint64_t value = 2;
int event_fd = eventfd(0, EFD_NONBLOCK);error
int i = 0;
int status = 0;epoll
/* epoll */
int epfd = 0;
struct epoll_event epevent[1], poolevent;
printf("event_fd=%d\n", event_fd);di
int ret = fork();
if (ret < 0)
{
printf("fork error\n");
return(1);
}文件
if (ret == 0)
{
epfd = epoll_create(1);
if (epfd == -1) {
printf("\nepoll_create, failed\n");
return -1;
}
poolevent.events = EPOLLOUT | EPOLLIN | EPOLLET;
poolevent.data.fd = event_fd;
sleep(5);
ret = epoll_ctl(epfd, EPOLL_CTL_ADD, event_fd, &poolevent);
if (ret != 0)
{
printf("\nepoll_ctl, failed\n");
close(epfd);
return -1;
}
for(i = 0; i < 2; i++)
{
printf("Child: wait events ... times: %d\n", i);
epoll_wait(epfd, epevent, 1, -1); // here to monitor only 1 event(epevent), so the third parameter is 1
if((epevent[0].events & EPOLLIN))
{
fprintf (stderr, "epoll in is %d\n", epevent[0].events);
read(event_fd, &value, sizeof(value));
}
else if((epevent[0].events & EPOLLOUT))
{
fprintf (stderr, "epoll out is %d\n", epevent[0].events);
}
else
{
fprintf (stderr, "epoll unknown events %d\n", epevent[0].events);
close (epevent[0].data.fd);
return(1);
}
}
close(epfd);
printf("Child: exit\n");
return 0;
}
printf("Father: write\n");
write(event_fd, &value, sizeof(value));
printf("Father: wait child exit\n");
waitpid(ret, &status, 0);
close(event_fd);
return 0;
}
输出结果:
event_fd=3
Father: write
Father: wait child exit
Child: wait events ... times: 0
epoll in is 5
Child: wait events ... times: 1
epoll out is 4
Child: exit
2. eventfd初始为值为0的例子
#include <stdio.h>
#include <sys/eventfd.h>
#include <sys/epoll.h>
#include <memory.h>
int main()
{
int event_fd = eventfd(0, EFD_NONBLOCK);
/* epoll */
int epfd = 0;
struct epoll_event epevent[1], poolevent;
printf("event_fd=%d\n", event_fd);
epfd = epoll_create(1);
if (epfd == -1) {
printf("\nepoll_create, failed\n");
return -1;
}
poolevent.events = EPOLLOUT | EPOLLIN | EPOLLET;
poolevent.data.fd = event_fd;
int ret = epoll_ctl(epfd, EPOLL_CTL_ADD, event_fd, &poolevent);
if (ret != 0)
{
printf("\nepoll_ctl, failed\n");
close(epfd);
return -1;
}
epoll_wait(epfd, epevent, 1, -1); // here to monitor only 1 event(epevent), so the third parameter is 1
if((epevent[0].events & EPOLLIN))
{
fprintf (stderr, "epoll in is %d\n", epevent[0].events);
}
else if((epevent[0].events & EPOLLOUT))
{
fprintf (stderr, "epoll out is %d\n", epevent[0].events);
}
else
{
fprintf (stderr, "epoll unknown events %d\n", epevent[0].events);
close (epevent[0].data.fd);
return(1);
}
close(epfd);
close(event_fd);
return 0;
}
输出结果:
event_fd=3
epoll out is 4
3. eventfd初始值为1的状况
#include <stdio.h>
#include <sys/eventfd.h>
#include <sys/epoll.h>
#include <memory.h>
int main()
{
int event_fd = eventfd(1, EFD_NONBLOCK);
/* epoll */
int epfd = 0;
struct epoll_event epevent[1], poolevent;
printf("event_fd=%d\n", event_fd);
epfd = epoll_create(1);
if (epfd == -1) {
printf("\nepoll_create, failed\n");
return -1;
}
poolevent.events = EPOLLOUT | EPOLLIN | EPOLLET;
poolevent.data.fd = event_fd;
int ret = epoll_ctl(epfd, EPOLL_CTL_ADD, event_fd, &poolevent);
if (ret != 0)
{
printf("\nepoll_ctl, failed\n");
close(epfd);
return -1;
}
epoll_wait(epfd, epevent, 1, -1); // here to monitor only 1 event(epevent), so the third parameter is 1
if((epevent[0].events & EPOLLIN))
{
fprintf (stderr, "epoll in is %d\n", epevent[0].events);
}
else if((epevent[0].events & EPOLLOUT))
{
fprintf (stderr, "epoll out is %d\n", epevent[0].events);
}
else
{
fprintf (stderr, "epoll unknown events %d\n", epevent[0].events);
close (epevent[0].data.fd);
return(1);
}
close(epfd);
close(event_fd);
return 0;
}
输出结果: event_fd=3 epoll in is 5