CTRL-C (尽管我没有处理SIGINT,并且使用termios将终端设置为“raw”模式)。
CTRL-C
void handle_sigwinch(int sig) { if(sig == SIGWINCH) { // set a flag here } } void setup_signals() { struct sigaction new_sig_action; new_sig_action.sa_handler = handle_sigwinch; sigemptyset (&new_sig_action.sa_mask); new_sig_action.sa_flags = 0; sigaction (SIGWINCH, NULL, &old_sig_action_); if (old_sig_action_.sa_handler != SIG_IGN) { sigaction (SIGWINCH, &new_sig_action, NULL); } } int main() { setup_signals(); int ch; // exit if ctrl-c is pressed while((ch == cin.get()) != 3) { if(ch > 0) cout << (char)ch; } }
我已经根据上提供的示例定制了代码 https://www.gnu.org/software/libc/manual/html_node/Sigaction-Function-Example.html#Sigaction-Function-Example 用于设置信号处理器。
在处理SIGWINCH之后,是否有什么事情导致我的程序停止工作?
编辑:我省略了使用cfmakeraw和tcsetattr设置终端的代码,在此之前,我发送了一个转义序列,用于将xterm置于备用屏幕缓冲区模式。
多亏了nos的评论,我通过调试器发现程序运行正常,但是 cin.get() 不再接收有效输入。所以我把我的谷歌搜索从“信号处理程序后程序挂起”改为“信号处理程序后输入流中断”,并找到了 this 回答StackOverflow,这让我意识到在调用信号处理程序后,输入流处于错误状态。
cin.get()
我在输入之前设置了一个复选框,以忽略字符值-1(我一定是想到了Arduino库) read
read
我放置了一个 cin.clear()
cin.clear()