【博客322】管道fd也可以放入epoll

    技术2024-07-11  75

    内容: 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; }

    运行结果:

    Processed: 0.013, SQL: 11