1. 程式人生 > >統一事件源簡介

統一事件源簡介

伺服器程式設計中通常有三大類事件需要處理,一類是I/O事件,一類是訊號事件,一類是時間事件。
訊號事件是一種非同步事件,當訊號來臨時,主邏輯會被打斷去執行訊號處理函式。而訊號到來的時機是不確定,如果此時訊號處理函式會去訪問一個已經被鎖住的資源,那麼這個執行緒就會被阻塞。所以訊號處理函式應該是可重入的。
一般訊號處理時會將一些訊號遮蔽,為了不遮蔽這些訊號太久,同時也不至於主邏輯被衝散,一種解決方案是:訊號處理函式只是簡單的通知主迴圈(用於處理I/O事件)並告訴訊號值,真正的訊號處理邏輯被主迴圈呼叫,根據訊號值做出相應的處理。訊號處理函式和主迴圈之間通常用管道做通訊。訊號處理函式從管道的寫端寫入訊號值,主迴圈從管道的讀端讀取訊號值。因為主迴圈本身就要利用I/O複用函式監聽連結進來的socket,所以將這個管道一併註冊進I/O複用函式就能在主迴圈中及時得到訊號到來的通知。

int pipefd[2];
... 
void sig_handler(int sig)  
{  
    int save_errno = errno;  
    int msg = sig;  
    send(pipefd[1], (char*)&msg, 1, 0);//將訊號按位元組寫入管道,以通知主迴圈
    errno = save_errno;  
} 

void addsig(int sig)  
{  
    struct sigaction sa;  
    memset(&sa, '\0', sizeof(sa));  
    sa.sa_handler = sig_handler;  
    sa.sa_flags |= SA_RESTART; //訊號如果打斷了慢速系統呼叫,中斷處理完成之後繼續恢復系統呼叫
    sigfillset(&sa.sa_mask);//在訊號處理函式中遮蔽所有訊號
    assert(sigaction(sig, &sa, NULL
) != -1); } void handle_sig(int sig) { switch(sig) { case SIGCHLD: ... case SIGHUP: ... case SIGTERM: ... case SIGINT: ... ... } } ... int main(int argc, char **argv) { ... ret=socketpair(PF_UNIX,SOCK_STREAM,0
,pipefd); setnonblocking(pipefd[1]); addfd(epollfd,pipefd[0]); while(true) { int ret = epoll_wait(epollfd, events, MAX_EVENTS, -1); for (int i = 0; i < ret; i++) { if(events[i].fd == pipefd[0] && events[i].events & EPOLLIN) //接收到訊號 { char signals[1024]; int num = recv(pipefd[0], signals, sizeof(signals), 0); if (num == -1) continue; else if (num == 0) continue; else { //每個訊號值佔1位元組,所以按位元組來逐個接收訊號 //可能處理的時候收到了多個訊號 for (int i = 0; i < num; i++) { handle_sig(signals[i]); } } } } } ... }

相關推薦

統一事件簡介

伺服器程式設計中通常有三大類事件需要處理,一類是I/O事件,一類是訊號事件,一類是時間事件。 訊號事件是一種非同步事件,當訊號來臨時,主邏輯會被打斷去執行訊號處理函式。而訊號到來的時機是不確定,如果此

網路程式設計常用訊號與統一事件

首先給出基本所有的訊號,方便以後查詢. *1 SIGHUP 終止 終止控制終端或程序 2 SIGINT 終止 鍵盤產生的中斷(Ctrl-C) 3 SIGQUI

libevent原始碼學習-----統一事件及訊號繫結函式

libevent在對檔案描述符,套接字進行監控時直接放到event,這些event通過io多路複用函式進行監控,然而對應訊號來說io複用函式卻無能為力,為了解決問題,libevent採用統一事件源的方式,即將訊號也表現成event的形式,用到了socketpai

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

訊號是一種非同步事件:訊號處理函式和程式的主迴圈是兩條不同的執行路線。 //統一事件源 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <s

vue獲取點擊事件的方法

col script -c function get com jquer current () 1 <!DOCTYPE html> 2 <html lang="zh-CN"> 3 <head> 4 <

獲取事件不能重復使用id獲取

clas log bsp div image src 簽名 img alt 正確用法為: 配合標簽名使用,也不能跟類名連用 PS:當時花了半個多小時才找到原因 獲取事件源不能重復使用id獲取

監聽器、事件事件事件註冊深度剖析

left local ets clas imp for 圖形 沒有 執行 AWT事件處理 事件處理機制,幾類具有典型代表意義的事件: 幾種常用事件處理機制 查看JDK Doc文檔中的 用戶圖形界面的行為 1、事件類型 (1)事件類的層次

js將字串作為函式名呼叫,實現input文字框等form表單元素回車鍵統一事件響應

  通過給文字框<input enterKey=“fnName” />設定enterKey=“fnName”,頁面載入完後會自動繫結input的keydown事件,捕捉到回車鍵則呼叫fnName函式,如select等其它form元素也可以。要實現form表單元素回車鍵統一事件響應

“點選”改變樣式(事件,冒泡捕獲)

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initi

關於事件事件一系列的相容問題;

每個元素身上的事件都是天生自帶的,只需要我們給這個事件繫結一個方法(不需要去定義它),當事件觸發時就會執行這個方法 1、時間繫結的兩種寫法 (1)div.onclick=function(){} (2)div.addEventListener()或div.attachEvent() (1)與(2)這兩

複雜事件處理簡介

複雜事件處理 概念 什麼是複雜事件處理 複雜事件處理(Complex event processing, CEP) 是多事件的事件處理概念,其目標是在事件集合(事件流、事件

圖解函式計算&事件服務

概覽 事件源服務 是可以觸發函式的服務的集合,例如物件儲存 OSS,日誌服務,API 閘道器,定時器(Timer)和 HTTP 請求等。事件發生時,承載觸發器的事件源服務決定是否執行您的函式。例如,當您建立一個 OSS PutObject 觸發器後,上傳物件到指定的 OSS Bucket 就是一次事件,

JavaScript事件冒泡簡介及應用

一、什麼是事件冒泡 在一個物件上觸發某類事件(比如單擊onclick事件),如果此物件定義了此事件的處理程式,那麼此事件就會呼叫這個處理程式,如果沒有定義此事件處理程式或者事件返回true,那麼這個事件會向這個物件的父級物件傳播,從裡到外,直至它被處理(父級物件

小白學前端------------- 事件,BOM簡介,DOM簡介

一 .事件 1.1 事件繫結 # 寫在html元素中 <button onclick = 'code...'> </button> #把事件當作元素物件的方法(更常用) btnEle.onclick = function(){ }

weex開發-使用weex-ui繫結事件注意事項

在使用weex-ui提供的控制元件繫結事件源的時候,一定要注意事件源的繫結。新手更需要額外注意,簡單舉個例子,就拿wxc-stepper來說,使用方法如下: <template> <

關於“事件”,“事件物件”,“事件”等幾個概念的理解

事件:指的是滑鼠點選,鍵盤輸入等使用者操作。其本身就是一個物件。 事件物件:事件發生後,在flex中就稱為事件物件,事件物件有針對其的偵聽器,事件物件有其屬性,比如:target。 事件發生的物件:指事件源。 事件源:發生事件的物件,一般指某一具體的元件,

獲取事件

設定事件源 <label :data-weight="item1.EvaluateWeight" @click='radioClick' :data-id="item1.EvaluateDictId"> 獲取事件源   radioClick: funct

Glib事件

#include <glib.h>    #include <stdio.h>    #include <strings.h>    GMainLoop* loop;    //當stdin有資料可讀時被GSource呼叫的回撥函式    gboolean cal

Monkey原始碼分析之事件

上一篇文章《Monkey原始碼分析之執行流程》給出了monkey執行的整個流程,讓我們有一個概貌,那麼往後的文章我們會嘗試進一步的闡述相關的一些知識點。 這裡先把整個monkey類的結構圖給出來供大家參考,該圖源自網上(我自己的backbook pro上沒有安裝OmniG

Android Accessibility使用及事件流程簡介

Accessibility是Android從API 4開始提供的一個功能,它主要目的是幫助一些因為有視覺,聽覺,身體障礙而無法完全使用觸控式螢幕或鈴聲等的使用者來使用Android的。而實際上現在很多開發者都用它來實現一些其他功能了,比如說微信搶紅包,自動安裝A