2014-11-02 34 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