内容: epoll可以监听文件描述符fd,但是不仅限于socket fd,甚至可以是pipe fd
epoll与pipe配合:
1、将pipe fd放入epoll进行监听,然后线程在epoll_wait阻塞时,可以通过管道发送内容使其返回,
开始执行epoll_wait下面的代码逻辑
2、可以作为消息通知的一种机制
实例:
父子进程通过管道来进行通信,同时利用epoll来进行监听
代码:
#include <iostream>
#include <unistd.h>
#include <errno.h>
#include <sys/epoll.h>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
int main()
{
struct epoll_event ev;
const int MAXEVENTS = 1024;
struct epoll_event events[MAXEVENTS];
int ret,pid;
int pipe_fd[2];
if((ret=pipe(pipe_fd))<0)
{
cout<<"create pipe fail:"<<ret<< ",errno:" << errno <<endl;
return -1;
}
ev.data.fd = pipe_fd[0];
ev.events = EPOLLIN|EPOLLET;
int epfd=epoll_create(MAXEVENTS);
ret=epoll_ctl(epfd,EPOLL_CTL_ADD,pipe_fd[0],&ev);
if (ret != 0)
{
cout << "epoll_ctl fail:" << ret << ",errno:" << errno << endl;
close(pipe_fd[0]);
close(pipe_fd[1]);
close(epfd);
return -1;
}
if((pid=fork())>0)
{
int count=epoll_wait(epfd,events,MAXEVENTS,5000);
char r_buf[100];
for(int i=0;i<count;i++)
{
if((events[i].data.fd==pipe_fd[0])&&(events[0].events&EPOLLIN))
{
int r_num=read(pipe_fd[0],r_buf,100);
cout<<"read "<<r_num<<" bytes data from the pipe : "<<r_buf<<endl;
}
}
close(pipe_fd[1]);
close(pipe_fd[0]);
close(epfd);
}
else if(pid==0)
{
close(pipe_fd[0]);
char w_buf[100];
strcpy(w_buf,"hello world");
if(write(pipe_fd[1],w_buf,12)!=-1)
cout<<"data had written!\n";
close(pipe_fd[1]);//write
}
return 0;
}
运行结果: