高效能伺服器程式設計之統一事件源

2021-10-11 17:46:43 字數 2718 閱讀 7318

在伺服器程式設計框架中,都伴隨著配置初始化,日誌列印、訊號處理、連線處理,資料處理等步驟。訊號常常可以用來進行父子程序,執行緒的管控,但訊號與連線到來/資料到來走的是不同的執行路線,並且訊號處理函式要盡可能快地執行完,因為在訊號函式處理期間,該訊號不會被再次觸發。為了能統一管理這些事件,一種典型的統一事件源的方法是,把訊號的主要處理邏輯放到主迴圈中來做,當訊號處理函式被觸發時,它只是簡單地執行目標訊號對應的邏輯**,訊號處理函式通常使用管道來將訊號傳遞給主迴圈,主迴圈通過i/o復用系統呼叫來監聽管道的讀端檔案描述符上的可讀事件。這樣訊號事件就跟其他i/o事件一樣被處理。而不會在處理函式中處理導致該訊號被遮蔽很久。

**如下:

#inlude 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define max_event_number 1024

static

int pipefd[2]

;int

setnonblocking

(int fd)

void

addfd

(int epollfd,

int fd)

//訊號處理函式,負責將訊號寫入管道

void

sig_handler

(int sig)

/*設定訊號處理函式*/

void

add_sig

(int sig)

intmain

(int argc,

char

*ar**)

const

char

*ip = ar**[1]

;int port =

atoi

(ar**[2]

);int ret =0;

struct sockaddr_in address;

bzero

(&address,

sizeof

(address));

address.sin_family = af_inet;

inet_pton

(af_inet, ip,

&address.sin_addr)

; address.sin_port =

htons

(port)

;int listenfd =

socket

(pf_inet, sock_stream,0)

;assert

(listenfd >=0)

; ret =

bind

(listenfd,

(struct sockaddr *

)&address,

sizeof

(address));

if(ret ==-1

) ret =

listen

(listenfd,5)

;assert

(ret !=-1

);epoll_event events[max_event_number]

;int epollfd =

epoll_create(5

);assert

(epollfd !=-1

);addfd

(epollfd, listenfd)

;/*使用sockpair建立管道,把pipefd[0]上的可讀事件註冊到epollfd中*/

ret =

socketpair

(pf_unix, sock_stream,

0, pipefd)

;assert

(ret !=1)

;//寫埠,訊號函式呼叫,不要阻塞

setnonblocking

(pipefd[1]

);//讀埠,主迴圈呼叫

addfd

(epollfd, pipefd[0]

);/*設定一些訊號的處理函式*/

addsig

(sighup)

;addsig

(sigchld)

;addsig

(sifterm)

;addsig

(sigint)

; bool stop_server = false;

while

(!stop_server)

for(

int i =

0; i < number; i++

)/*如果是訊號管道*/

elseif(

(sockfd == pipefd[0]

)&&(events[i]

.events & epollin)

)case sigint:

case sigterm:}}

}else}}

}printf

("close fds\n");

close

(listenfd)

;close

(pipefd[1]

);close

(pipefd[0]

);return0;

}

高效能伺服器程式設計之epoll

在linux的網路程式設計中,經常使用多執行緒處理高併發的問題,然而linux系統對執行緒數量是有限制的,更重要的是執行緒的排程有系統開銷的,在客戶端數量龐大時,這將是無法接受的問題 另一種處理高併發的方法是使用select來做事件觸發,select實現中,它是採用輪詢來處理的,輪詢的fd數目越多,...

linux網路程式設計十八 統一事件源

訊號是一種非同步事件 訊號處理函式和程式的主迴圈是兩條不同的執行路線。統一事件源 include include include include include include include include include include include include include inclu...

Linux高效能伺服器程式設計(一)

osi分層模型 應用層 表示層 會話層 傳輸層 網路層 資料鏈路層 物理層 tcp ip模型 應用層 傳輸層 網路層 資料鏈路層 應用層 https 工作原理 1.tls與https的關係 2.什麼是證書 數字簽名 傳輸層 tcp 三次握手 四次揮手 三次握手 1.客戶端傳送syn,seq x 2....