我正在研究一个监听按键的守护进程。我正在使用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。你会如何解决它?
答案 0 :(得分:0)
一个选项是使用fork,以便父级继续侦听(接受)新事件,而子级则对到达的事件进行操作。