我正在使用守护进程来监听按键。我使用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。你会如何解决它?
没有别的效率。对全局状态使用全局变量是适当的。 – 2014-11-02 01:44:53
谢谢,也许我现在就把它留下。我仍然想知道,如果有任何“C++方法”来解决这个问题,或者另一种更优雅的方式。 – tolga9009 2014-11-02 19:24:04
使其“更多C++”的唯一变化是使用'std :: atomic'而不是'sig_atomic_t'。 –
2014-11-02 19:33:30