Linux 訊號 統一事件源

2021-09-22 18:20:29 字數 2146 閱讀 3620

訊號是一中非同步事件:訊號處理函式和程式的主迴圈是兩條不同的執行路線。訊號處理函式需要盡可能快地執行完畢,以確保該信 號不會被遮蔽(訊號在處理期間,系統不會再觸發它)太久。一種典型的解決方案是:把訊號的主要處理邏輯放到程式的朱迴圈中,當訊號函式被觸發時,他只是簡單地通知主迴圈程式接收訊號,並把訊號值傳遞給主迴圈,主迴圈再根據接收到的訊號值執行目標訊號對應的邏輯**。 訊號處理函式通常使用管道來將訊號「傳遞」給主迴圈:訊號處理函式往管道寫端寫入訊號值,主迴圈則從管道讀端讀出該訊號值。那麼主迴圈怎麼知道管道上何時有資料可讀呢?這很簡單,我們只需要使用i/o復用系統呼叫來監聽管道的讀端檔案描述符上的可讀事件。如此一來,訊號事件就和其他i/o事件一樣被處理,即統一訊號源

#include #include #include #include #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 addsig( int sig )

int main(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));

inet_pton(af_inet, ip, &address.sin_addr);

address.sin_family = af_inet;

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);

struct epoll_event events[ max_event_number ];

int epollfd = epoll_create(5);

assert( epollfd != -1);

addfd( epollfd, listenfd);

// 使用sockpair來傳遞資訊g

ret = socketpair( pf_unix, sock_stream, 0, pipefd );

assert( ret != -1 );

setnonblocking( pipefd[1] );

addfd( epollfd, pipefd[0] );

addsig( sighup );

addsig( sigchld );

addsig( sigterm );

addsig( sigint );

bool stop_server = false;

while( !stop_server )

int i = 0;

for( i; i < number; i++ )

else if( ( sockfd == pipefd[0] ) && ( events[i].events & epollin ))

else

case sigterm:

case sigint:}}

}}

else{}}}

printf("close fds\n");

close(listenfd);

close(pipefd[0]);

close(pipefd[1]);

return 1;

}

Linux訊號處理統一事件源

include include include include include include include include include include include include include include define max event number 1024 static in...

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

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

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

在伺服器程式設計框架中,都伴隨著配置初始化,日誌列印 訊號處理 連線處理,資料處理等步驟。訊號常常可以用來進行父子程序,執行緒的管控,但訊號與連線到來 資料到來走的是不同的執行路線,並且訊號處理函式要盡可能快地執行完,因為在訊號函式處理期間,該訊號不會被再次觸發。為了能統一管理這些事件,一種典型的統...