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