淺析libev的ev_signal過程

來源:互聯網
上載者:User

標籤:

  ev_signal是libev提供的對訊號處理的一個模組,基本上是對sigaction函數的一個封裝,並將本身是非同步訊號轉化為同步。ev_signal的使用十分簡單:

#include <ev.h>#include <stdio.h>static void   sigint_cb (struct ev_loop *loop, ev_signal *w, int revents)   {       puts ( "signal ....." );   }int main(int argc,char* argv[]){    struct ev_loop *loop = EV_DEFAULT;   ev_signal signal_watcher;   ev_signal_init (&signal_watcher, sigint_cb, SIGINT);   ev_signal_start (loop, &signal_watcher);   ev_run (loop,0);    return 0;}

C++的用法:

#include <iostream>#include <ev++.h>#include <signal.h>class CSignal{public:    void sig_cb(  ev::sig  &w, int revents )    {        std::cout << "catch signal ..." << std::endl;    }};int main(){    CSignal sg;    ev::sig sig_watcher;    sig_watcher.set<CSignal,&CSignal::sig_cb>( &sg );    sig_watcher.start(SIGINT);    ev_run( EV_DEFAULT,0 );}

  然後我們來看一下libev內部處理訊號的大概流程:

libev有各種各樣的watch,包括io、signal、timer,但這些watch基本使用以下結構typedef struct ev_watcher {    int active;    int pending;    int priority;    void *data;    void (*cb)(struct ev_loop *loop, struct ev_watcher *w, int revents);} ev_watcher;libev還有一個全域變數EV_DEFAULT,通過ev_default_loop (0)返回一個指標。其實ev_default_loop是在維護一個全域變數static struct ev_loop default_loop_struct;當第一次調用ev_default_loop會初始化default_loop_struct,以後都只是返回它的指標了。這個全域變數自己在維護了所有的watcher。並在一個loop中檢測它們是否觸發事件。1.當建立一個ev::sig對象,就建立了一個ev_watcher對象,並通過set函數設定對象指標,回呼函數到對象裡的data、cb變數,C方式則是通過ev_signal_init、ev_signal_set這些函數來設定。2.當調用ev_signal_start函數,會調用signalfd為當前訊號建立一個檔案描述符,然後通過ev_io來監控該檔案的讀事件。如果signalfd失敗,調用evpipe_init建立一個pipe,註冊一個ev_io到epoll中。調用原生的sigaction函數,將回呼函數處理為ev_sighandler,收到訊號時在ev_sighandler中調用ev_feed_signal來往pipe中寫資料。這樣在一個loop中,原先的ev_watcher對象就會收到讀訊息。

  可見,對於大多數使用了libev作為eventloop的程式而言,這樣應該是足夠簡潔方便的。更重要的是,libev有一層C++的wrap,使得在使用C++構建的程式能更方便的調用類的成員函數,而原生的sigaction是不能註冊類成員函數為回呼函數的。但相對原生的sigaction而言,libev有一個致命的地方:必須要在事件迴圈中才能收到訊號,即ev_run之後。想想,比如你的程式在初始化進入loop之前的時候當掉了,如果這時你想通過捕捉訊號來做一些清理工作,libev辦不到,sigaction則OK。

淺析libev的ev_signal過程

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.