2014-11-02 41 views
0

我正在使用守護進程來監聽按鍵。我使用epoll_wait()系統調用,它會阻止一個循環,直到設備上發生某些事情。儘管它在資源上超級高效,但它讓主循環變得有點困難。截至目前,我有一個使用全局變量的工作解決方案。然而,我想消除全局變量,但還沒有找到一個有效的方法來做到這一點。這是我的(簡體)代碼:使用sigaction()在C++中打破無限循環而不使用全局變量

/* global variables */ 
volatile sig_atomic_t run; 

void sig_handler(int sig) { 
    switch (sig) { 
     case SIGINT: 
      run = 0; 
      break; 
     case SIGTERM: 
      run = 0; 
      break; 
     default: 
      std::cout << "Unknown signal received." << std::endl; 
    } 
} 

int main(int argc, char *argv[]) { 
    /* signal handling */ 
    struct sigaction action; 
    action.sa_handler = sig_handler; 
    sigaction(SIGINT, &action, NULL); 
    sigaction(SIGTERM, &action, NULL); 

    run = 1; 

    /* main loop */ 
    while (run) { 
     epoll_wait(epoll_fd, &epoll_ev, MAX_EVENTS, -1); 
     /* 
     * epoll_wait() unblocks the loop, because an input has been 
     * registered. We use read() to check the input. 
     */ 
     process_input(get_input()); 
    } 

    return EXIT_SUCCESS; 
} 

您可以在此查看完整的代碼:https://github.com/tolga9009/sidewinderd。你會如何解決它?

+0

沒有別的效率。對全局狀態使用全局變量是適當的。 – 2014-11-02 01:44:53

+0

謝謝,也許我現在就把它留下。我仍然想知道,如果有任何「C++方法」來解決這個問題,或者另一種更優雅的方式。 – tolga9009 2014-11-02 19:24:04

+0

使其「更多C++」的唯一變化是使用'std :: atomic '而不是'sig_atomic_t'。 – 2014-11-02 19:33:30

回答

0

一個選項是使用分支,以便父母繼續偵聽(接受)新事件,而孩子在抵達的事件上操作。

+0

雖然這是一個非常有趣的想法,但它並沒有回答這個問題。如何在不使用全局變量的情況下破壞SIGINT&SIGTERM信號上的父循環? – tolga9009 2014-11-02 19:20:13

+0

基於分叉的設計不需要使用全局變量。但是,對於基於while循環的邏輯,全局變量是一種選擇。基於獨立於全局變量的while循環的更好的設計選項可以通過在條件中斷/代碼中繼續時使用while(1)。 – 2014-11-03 03:16:58