程序在处理 SIGWINCH 后挂起
Program hangs after handling SIGWINCH
只是为了好玩,我正在尝试编写一个库来完成 ncurses 所做的一切,使用 iostreams 并将转义序列直接发送到终端。
我正在尝试处理 SIGWINCH 以在调整终端大小时通知库。程序正常响应,直到我调整终端大小,然后它停止响应输入,甚至 CTRL-C
(尽管我没有处理 SIGINT,并且使用 termios 使终端处于 "raw" 模式)。
这是我从我的代码中复制的一些代码片段,用于展示我是如何设置信号处理程序的。
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()
不再接收有效输入。所以我将我的 google 搜索从 "program hangs after signal handler" 更改为 "input stream broken after signal handler" 并在 Whosebug 上找到了 this 答案,这让我意识到输入流在信号之后处于错误状态处理程序被调用。
我在输入前进行了检查以忽略字符值 -1(当我这样做时我一定是在考虑 Arduino 库 read
语句,其中 -1 表示没有输入可用)。所以程序基本上忽略了输入流上的错误。 (我编辑了我的问题代码以反映该遗漏)。
我在循环中的读取之前放置了一个 cin.clear()
语句,现在程序按预期运行。
只是为了好玩,我正在尝试编写一个库来完成 ncurses 所做的一切,使用 iostreams 并将转义序列直接发送到终端。
我正在尝试处理 SIGWINCH 以在调整终端大小时通知库。程序正常响应,直到我调整终端大小,然后它停止响应输入,甚至 CTRL-C
(尽管我没有处理 SIGINT,并且使用 termios 使终端处于 "raw" 模式)。
这是我从我的代码中复制的一些代码片段,用于展示我是如何设置信号处理程序的。
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()
不再接收有效输入。所以我将我的 google 搜索从 "program hangs after signal handler" 更改为 "input stream broken after signal handler" 并在 Whosebug 上找到了 this 答案,这让我意识到输入流在信号之后处于错误状态处理程序被调用。
我在输入前进行了检查以忽略字符值 -1(当我这样做时我一定是在考虑 Arduino 库 read
语句,其中 -1 表示没有输入可用)。所以程序基本上忽略了输入流上的错误。 (我编辑了我的问题代码以反映该遗漏)。
我在循环中的读取之前放置了一个 cin.clear()
语句,现在程序按预期运行。