使用sigaction()在没有全局变量的情况下在C ++中打破无限循环

时间:2014-11-02 01:38:30

标签: c++ linux loops signals daemon

我正在研究一个监听按键的守护进程。我正在使用epoll_wait()系统调用,它阻止一个循环,直到设备上发生了某些事情。虽然它对资源的超级效率,但它使得主循环突破有点困难。截至目前,我有一个使用全局变量的工作解决方案。但是,我想消除全局变量,但还没有找到一种有效的方法。这是我的(简化)代码:

/* 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。你会如何解决它?

1 个答案:

答案 0 :(得分:0)

一个选项是使用fork,以便父级继续侦听(接受)新事件,而子级则对到达的事件进行操作。