epoll機制(練習)

2021-05-28 02:46:00 字數 2941 閱讀 2387

天在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操作,如讀寫檔案 傳送網路資料...