本文共 1322 字,大约阅读时间需要 4 分钟。
之前玩过epoll, 再来看下, 其实也很简单:
#include建议有兴趣的同事实际玩一下上述程序。#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define NUM 1#define MAX 100int main() { epoll_event ev; ev.data.fd = STDIN_FILENO; ev.events = EPOLLIN; int epollFD = epoll_create(MAX); // 告诉内核监测的数目的最大值, 返回的epollFD为epoll管理句柄 epoll_ctl(epollFD, EPOLL_CTL_ADD, STDIN_FILENO, &ev); // 将ev和对应的STDIN_FILENO添加到epoll句柄,用于被epollFD管理 epoll_event all_events[MAX]; // "保活"的句柄直接从这里取 while(1) { int timeoutMS = 5000; // 5000ms // epoll_wait和select/poll函数的作用类似 int nfds = epoll_wait(epollFD, all_events, NUM, timeoutMS); // all_events和nfds是输出值, nfds是"保活"的数据 if(nfds < 0) { printf("epoll_wait error\n"); break; } if(nfds == 0) { printf("epoll_wait timeout\n"); continue; } printf("nfds is %d\n", nfds); for(int i = 0; i < nfds; i++) // 此处不用NUM, 而用nfds, 而all_events[i]渠道的就是"保活"的信息 { int iFD = all_events[i].data.fd; printf("iFD is %d\n", iFD); char szBuf[1024] = {0}; int recvLen = read(iFD, szBuf, sizeof(szBuf) - 1); if (recvLen > 0) { printf("recv data [%s]\n", szBuf); } else { epoll_ctl(epollFD, EPOLL_CTL_DEL, STDIN_FILENO, &ev); printf("recv error\n"); } } } close(epollFD); return 0;}
转载地址:http://bswti.baihongyu.com/