上一篇,講了幾個簡單的例子,相信你們對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