我正在使用守護進程來監聽按鍵。我使用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