天在cu上看到epoll, 自己既然還從來沒聽說過. google了一下.
練習了一下, 太懶, 本來可以寫的更好寫. 以下是從
/***
*/修改的. 關鍵是學習他的epoll使用, 其它的就別了. 自己編譯測試了一下, 感覺有點意思就share一下.
/**
* 該檔名為epoll.c
** 該測試**是從修改來的. 只供學習使用.
** 我的測試環境as4u3
* [gan@localhost ~]$ uname -r
* 2.6.9-34.el*/#
include
#include
socket
.h>
#include
#include
#include
#include
#include
#include
#include
<
errno
.h>
#include
#include
#include
#define maxline 1024
#define open_max 100
#define listenq 20
#define inftim 1000
#define local_ip "192.168.1.101"
/* 修改為自己本地機器就可以測試了 */
#define serv_port 5555
/*** thread task link
*/struct task
;struct user_data
;/* thread exec function */
void
*readtask(
void
*args)
;void
*writetask(
void
*args)
;/* declare epoll_event */
struct epoll_event ev, events[20]
;int epfd;
pthread_mutex_t mutex;
/* 執行緒安全使用 */
pthread_cond_t cond1;
/* 執行緒條件等待使用 */
struct task *readhead =
null
,*readtail =
null
,*writehead =
null
;void setnonblocking(
int sock)
if(fcntl(sock, f_setfl, opts | o_nonblock)
<0)
}int main(
)setnonblocking(connfd)
;char
*str = inet_ntoa(clientaddr.sin_addr)
;printf
("connect_from >> %s \n"
, str)
;ev.data.fd = connfd;
//設定用於讀操作的檔案描述符
ev.events = epollin | epollet;
//設定用於注測的讀操作事件
//註冊ev
epoll_ctl(epfd, epoll_ctl_add, connfd,
&ev);}
else
if(events[i]
.events & epollin)
else
//喚醒所有等待cond1條件的執行緒
pthread_cond_broadcast
(&cond1)
;pthread_mutex_unlock
(&mutex);}
else
if(events[i]
.events & epollout)}}
}/**
* thread exec function
*/void
*readtask(
void
*args)
fd = readhead-
>fd;
//從任務佇列取出乙個讀任務
struct task *tmp = readhead;
readhead = readhead-
>next;
free
(tmp)
;pthread_mutex_unlock
(&mutex)
;data =
(struct user_data *
)malloc
(sizeof
(struct user_data));
data-
>fd = fd;if(
(n =
read
(fd, data-
>
line
, maxline)
)< 0)
else
printf
("readline error \n");
if(data !
=null
)free
(data);}
else
if(n =
= 0)
else}}
/*** 乙個簡單的makefile
*/all: epoll.c
gcc -wall -g -o epoll epoll.c -lpthread
clean:
rm -f epoll
-----------------------------------------
測試環境很簡單, 使用你的firefox, or ie 來訪問該埠就可以了.
epoll機制詳解
大牛的詳解 epoll詳解 什麼是epoll?epoll的工作原理 epoll的兩種工作方式 邊緣觸發 et lt模式下開發基於epoll的應用要簡單些,不太容易出錯。而在et模式下事件發生時,如果沒有徹底地將緩衝區資料處理完,則會導致緩衝區中的使用者請求得不到響應 epoll的優點 支援乙個程序開...
Linux中的epoll機制
linux中的epoll機制的作用 用於一次監聽多個描述符的可讀可寫狀態,而不需要為每個描述符建立乙個執行緒。相關的api int epoll create int max fds 傳遞的引數為可監聽的最大描述符數量,返回乙個epoll物件描述符。int epoll ctl int epfd,int...
十三 select poll和epoll機制的介紹
1 同步io 在作業系統中,程式執行的空間分為核心空間和使用者空間,使用者空間所有對io操作的 如檔案的讀寫 socket的收發等 都會通過系統呼叫進入核心空間完成實際的操作。cpu的速度遠快於硬碟 網路等io。在乙個執行緒中,cpu執行 的速度極快,然而,一旦遇到io操作,如讀寫檔案 傳送網路資料...