在开始之前,我想澄清一下,这不是一个命令行工具,而是一个通过它自己的命令行界面接受命令的应用程序.
编辑:我必须为我之前的解释道歉,显然我没有做好解释它的工作.再一次...
我正在构建一个接受用户命令的命令行界面应用程序.我有一个信号处理程序设置来捕获信号,然后设置我需要终止应用程序的标志.我遇到的问题是我能找到的所有控制台功能都是阻塞的,这意味着我无法检测到我需要退出控制台处理循环,直到用户按下某个键(或输入,具体取决于函数) ).
是否有一些标准的方法我可以做非块控制台交互,或者是否有一种优雅的方式来构造程序,这样如果我只是从信号线程终止,那么一切都将被正确处理和释放(请不要错误 - 理解这一点,我知道如何使用锁定和释放信令线程中的资源来实现这一点,但这可能会变得混乱,所以我宁愿避免它)
希望这个解释更有意义......
好的 - 这对我在Windows上工作并且是可移植的 - 请注意#ifdef SIGBREAK - 这不是标准信号.
#include#include #include #include using namespace std; namespace { volatile sig_atomic_t quit; void signal_handler(int sig) { signal(sig, signal_handler); quit = 1; } } int main() { signal(SIGINT, signal_handler); signal(SIGTERM, signal_handler); #ifdef SIGBREAK signal(SIGBREAK, signal_handler); #endif /* etc */ while (!quit) { string s; cin >> s; cout << s << endl; } cout << "quit = " << quit << endl; }
在*nix上,您可以使用该signal
函数注册信号处理程序:
#includevoid signal_handler(int sig) { // Handle the signal } int main(void) { // Register the signal handler for the SIGINT signal (Ctrl+C) signal(SIGINT, signal_handler); ... }
现在,只要有人按Ctrl + C,就会调用你的信号处理程序.