1.介紹
epoll和之前介紹的select/poll有很大的差異,幾乎現在所有的高併發i/o模型都使用epoll(如nginx)。
#include int epoll_create(int size);
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
int epoll_wait(int epfd, struct epoll_event *events,int maxevents, int timeout);
接下來逐一介紹這3個api:
(1)epoll_create建立乙個epoll
int epoll_create(int size);
引數:
(2)epoll_ctl設定建立的epoll
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
引數:
struct epoll_event的結構體描述如下:
struct epoll_event ;
epoll_data_t定義如下:
typedef union epoll_data epoll_data_t;
epoll_ctl 成功返回0,錯誤返回-1。
(3)epoll_wait檢測事件。
int epoll_wait(int epfd, struct epoll_event *events,int maxevents, int timeout);
引數:
epoll_wait 成功會返回事件的 fd 數目;返回 0 表示超時;失敗返回 -1。
2.編碼實戰
#include#include#include#include#include#include#include#includeint main(int argc, char* ar**)
struct sockaddr_in addr;
addr.sin_family = af_inet;
addr.sin_addr.s_addr = htonl(inaddr_any);
addr.sin_port = htons(8080);
int ret;
ret = bind(fd, (struct sockaddr*) &addr, sizeof(addr));
if(ret == -1)
ret = listen(fd, somaxconn);
if(ret == -1)
struct sockaddr_in clientaddr;
socklen_t clientaddrlen = sizeof(clientaddr);
//建立epoll
int epollfd = epoll_create(1);
if(epollfd == -1)
struct epoll_event listenfd;
listenfd.data.fd = fd;
listenfd.events = epollin;
//設定socket(fd新增到epollfd)
ret = epoll_ctl(epollfd, epoll_ctl_add, fd, &listenfd);
if(ret == -1)
//開始用epoll來管理多個連線
while(true)
else if(num == 0)
else
printf("a client connected!,ip=%s,port=%d\n",inet_ntoa(clientaddr.sin_addr), ntohs(clientaddr.sin_port));
struct epoll_event tmp_fd;
tmp_fd.data.fd = afd;
tmp_fd.events = epollin;
int ret = epoll_ctl(epollfd, epoll_ctl_add, afd, &tmp_fd);
if(ret == -1)
}else;
int len = recv(afds[i].data.fd, buf, 256, 0);
if(len <= 0)
printf("afd[%d] recv %d bytes:%s\n", i, len, buf);}}
}}
} close(fd);//關閉監聽socket
}
Linux I O復用技術 poll
1.介紹 poll函式的作用是檢測一組 socket 中某個或某幾個是否有 事件 就緒,即可讀 可寫。在linux平台下的poll定義如下 include int poll struct pollfd fds,nfds t nfds,int timeout 引數 struct pollfd 對於st...
Linux IO同步復用
關於同步與非同步 同步 呼叫者在執行乙個呼叫時,一直等待呼叫完成返回後才進行後續操作。非同步 呼叫者執行乙個呼叫時,立即返回,繼續進行後續操作而不關心呼叫是否完成。非同步與同步是對通訊機制的描述,而阻塞 非阻塞關心的是呼叫者的狀態 阻塞 當執行乙個呼叫時,呼叫者執行緒一直被掛起 cpu時間片切換給其...
Linux IO同步復用
io復用通過時分復用的形式,多個socket連線使用同乙個io執行緒,io執行緒通過系統呼叫的方式獲知被監視的檔案識別符號列表中就緒的檔案,執行io操作。這裡的同步指代在執行io操作時,會等待動作完成再繼續執行,復用是採取乙個執行緒完成對多個io流的處理。linux中poll方式是對select的改...